sqlalchemy - Flask-迁移 sqlalchemy.exc.NoReferencedTableError : Foreign key associated with column

标签 sqlalchemy flask flask-sqlalchemy sqlalchemy-migrate flask-migrate

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

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 并收到以下错误:

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你的外键。

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

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)
    # ...

关于sqlalchemy - Flask-迁移 sqlalchemy.exc.NoReferencedTableError : Foreign key associated with column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19320108/

相关文章:

python - 是否可以在 python 中重置 sqlalchemy 查询对象的 group_by 项?

python - SQLAlchemy DB 升级和 MySQL SSH

python - 如何使用 SQLAlchemy 和 Flask 对两个表执行自然连接?

python - Celery 在使用不正确的 broker url 发布任务时挂起

Javascript:表单验证导致选定的 Ajax Live Search 字段被重置为 Null?

python - 无法使用 Git 部署生成的 Flask 文件

python - Flask url_for 停止接受两位数的用户 ID。漏洞?

python - 使用 sqlalchemy 类型的数据框 to_sql 的无符号整数

python - SQLAlchemy 中的复杂外键约束

python - sqlalchemy 检查对象是否在模型中