2014-10-06 125 views
3

我有如下應用結構:燒瓶的SQLAlchemy + create_all()失敗,許多一對多的關係創建

run.py 
|->app 
    |->models 
     |-> user.py (declares role-to-user relationship table and User model) 
     |-> role.py (declares Role model) 
    |-> main.py (contains initialization and all required imports) 
    |-> extensions (here sqlalchemy variable declared to be imported later) 

當我試圖創建下面的方式初始DB結構:

from app.models import * 
from app.extensions import db 
from app.main import myapp #app is initialized with all packages like assets, db, security, etc. 

with myapp.test_request_context(): 
    db.create_all() 

我有一個例外: NoReferencedTableError:與'users_to_roles.user_id'列關聯的外鍵找不到表''用戶',用於生成目標列'id'的外鍵

我也試圖道瓊斯它下面的方式:

@app.before_first_request 
def initialize_database(): 
    db.create_all() 

沒有成功

我試圖移動RoleUser模型聲明瞭相同的結果相同的文件。我在這裏閱讀文檔:https://pythonhosted.org/Flask-SQLAlchemy/quickstart.html,但它說'你只需要導入db',它不起作用。

這裏是User模型和關係表是如何申報(角色模型類似於User):

users_to_roles_association_table = db.Table('users_to_roles', 
    db.Column('user_id', db.Integer, db.ForeignKey('users.id')), 
    db.Column('role_id', db.Integer, db.ForeignKey('roles.id'))) 

class User(db.Model, UserMixin): 
    id = db.Column(db.Integer, primary_key=True) 
    email = db.Column(db.String(255), unique=True) 
    ....... 
    roles = db.relationship('Role', secondary=users_to_roles_association_table, 
          backref=db.backref('users', lazy='dynamic')) 

如何使用燒瓶SQLAlchemy中創建初始數據庫結構?

回答

4

之一的Flask-SQLAlchemy特徵是自動錶名稱生成從類名當__tablename__類屬性爲一個模型類沒有定義。從https://pythonhosted.org/Flask-SQLAlchemy/models.html

Some parts that are required in SQLAlchemy are optional in Flask-SQLAlchemy. For instance the table name is automatically set for you unless overridden. It’s derived from the class name converted to lowercase and with 「CamelCase」 converted to 「camel_case」.

在你的情況下,User類將有它的__tablename__屬性推斷爲user這意味着沒有定義users表。

你可以解決這個問題明確地設置__tablename__或通過改變ForeignKey參數相匹配的自動生成的表名:

class User(db.Model, UserMixin): 
    __tablename__ = 'users' 
    ... 

class Role(db.Model): 
    __tablename__ = 'roles' 
    ... 

或離開__tablename__屬性未定義和修改關聯表:

users_to_roles_association_table = db.Table('users_to_roles', 
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')), 
    db.Column('role_id', db.Integer, db.ForeignKey('role.id'))) 
+0

這樣一個愚蠢的錯誤!謝謝,你救了我一些神經! – 2014-10-06 17:31:40

+1

我試圖通過顯式設置表名來覆蓋__tablename__,但它仍然遵循默認的單數名稱。 – 2015-04-01 11:48:59

+0

@KevinQ你可以分享的代碼示例說明問題嗎? – dgilland 2015-04-01 15:55:11