我在我的应用程序中使用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 / __初始化__。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'
我在这里做错了什么?
答案 0 :(得分:22)
您让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)
# ...
答案 1 :(得分:0)
我也一直在寻找解决您长时间处理的类似信息问题的解决方案……最后,我发现的解决方案被添加到每个“表类”行__tablename__ = '<your_table_name>'
< / p>
似乎可以帮助烧瓶找到您的桌子
答案 2 :(得分:0)
就我而言,问题是我不小心通过类名与表名调用了外键......
喜欢:db.Column(db.Integer, db.ForeignKey('ClassListTypes.id')
vs db.Column(db.Integer, db.ForeignKey('list_types.id')