7

我用的烧瓶中迁移我的应用程序,有如下型号外键关联:烧瓶迁移sqlalchemy.exc.NoReferencedTableError:与

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' 

什么我错在这里做什么?

+0

2个模型是否在相同模块中定义?另外run.py是怎么样的? – codegeek

+0

是的,我用更多的代码更新了这个问题。谢谢! –

回答

14

你让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) 
    # ... 
+0

将'listtype.id'改为'list_type.id'确实有效!我在这里发布了我的下一个阻塞问题:http://stackoverflow.com/questions/19323990/flask-migrate-not-creating-tables –

+0

也为我工作!谢谢! –