Flask-Migrate sqlalchemy.exc.NoReferencedTableError:与列关联的外键 [英] Flask-Migrate sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column

查看:193
本文介绍了Flask-Migrate sqlalchemy.exc.NoReferencedTableError:与列关联的外键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的应用程序中使用Flask-Migrate,具有以下模型:

I am using Flask-Migrate in my application, with the following models:

listpull/models.py

from datetime import datetime

from listpull import db


class Job(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    list_type_id = db.Column(db.Integer, db.ForeignKey('listtype.id'),
                             nullable=False)
    list_type = db.relationship('ListType',
                                backref=db.backref('jobs', lazy='dynamic'))
    record_count = db.Column(db.Integer, nullable=False)
    status = db.Column(db.Integer, nullable=False)
    sf_job_id = db.Column(db.Integer, nullable=False)
    created_at = db.Column(db.DateTime, nullable=False)
    compressed_csv = db.Column(db.LargeBinary)

    def __init__(self, list_type, created_at=None):
        self.list_type = list_type
        if created_at is None:
            created_at = datetime.utcnow()
        self.created_at = created_at

    def __repr__(self):
        return '<Job {}>'.format(self.id)


class ListType(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return '<ListType {}>'.format(self.name)

run.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from listpull import app, manager
manager.run()

listpull/__ init __.py

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.script import Manager
from flask.ext.migrate import Migrate, MigrateCommand
from mom.client import SQLClient
from smartfocus.restclient import RESTClient


app = Flask(__name__)
app.config.from_object('config')

db = SQLAlchemy(app)

migrate = Migrate(app, db)

manager = Manager(app)
manager.add_command('db', MigrateCommand)

...

import listpull.models
import listpull.views

我使用./run.py db init初始化了数据库,然后运行./run.py db migrate并收到以下错误:

I initialized the database using ./run.py db init and then I run ./run.py db migrate and I get the following error:

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'job.list_type_id' could not find table 'listtype' with which to generate a foreign key to target column 'id'

我在做什么错了?

推荐答案

您正在让Flask-SQLAlchemy选择表的名称.如果我没记错的话,对于名为ListType的类,表名将为list_type(或类似名称),而不是您在外键中指定的listtype.

You are letting Flask-SQLAlchemy choose the names for your tables. If I remember correctly, for a class called ListType the table name will be list_type (or something similar), not the listtype that you specified in your foreign key.

我的建议是您使用__tablename__指定自己的表名,这样它们就在代码中是显式的,而不是为您神奇地确定的.例如:

My recommendation is that you specify your own table names using __tablename__, that way they are explicit in the code and not magically determined for you. For example:

class Job(db.Model):
    __tablename__ = 'jobs'
    id = db.Column(db.Integer, primary_key=True)
    list_type_id = db.Column(db.Integer, db.ForeignKey('list_types.id'),
                             nullable=False)
    # ...

class ListType(db.Model):
    __tablename__ = 'list_types'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)
    # ...

这篇关于Flask-Migrate sqlalchemy.exc.NoReferencedTableError:与列关联的外键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆