Flask 炼金术+;创建多对多关系失败

Flask 炼金术+;创建多对多关系失败,flask,flask-sqlalchemy,Flask,Flask Sqlalchemy,我有以下应用程序结构: 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) |-> exte

我有以下应用程序结构:

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()
@app.before_first_request
def initialize_database():
    db.create_all()
我有一个例外: NOREFERENCEDTABLERROR:与列“users\u to\u roles.user\u id”关联的外键找不到表“users”,无法使用该表生成指向目标列“id”的外键

我也试着用以下方式来道指:

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()
@app.before_first_request
def initialize_database():
    db.create_all()
无功而返

我试图将
角色
移动到同一个文件中,其中
用户
模型的声明结果相同。我在这里读了文档:但是它说‘您只需要导入
db
’,它不起作用

下面是如何声明
用户
模型和关系表(角色模型看起来类似于
用户
):


如何使用Flask SQLAlchemy创建初始DB结构?

Flask SQLAlchemy的一个功能是,当没有为模型类定义
\uuuuu tablename\uuuuu
类属性时,从类名自动生成表名。发件人:

SQLAlchemy中需要的某些部分在中是可选的 炼金术。例如,表名会自动设置为 除非被推翻,否则您将被拒绝。它是从转换为的类名派生的 小写,并将“CamelCase”转换为“camel_case”

在您的情况下,
User
类将其
\uuuuu tablename\uuuu
属性推断为
User
,这意味着没有定义
users

您可以通过显式设置
\uuuu tablename\uuu
或更改
ForeignKey
参数以匹配自动生成的表名来解决此问题:

类用户(db.Model,UserMixin):
__tablename_uu='users'
...
类角色(db.Model):
__tablename_uu='角色'
...
或者保留未定义的
\uuuu tablename\uuuu
属性,并修改关联表:

users\u to\u roles\u association\u table=db.table('users\u to\u roles',
db.Column('user\u id',db.Integer,db.ForeignKey('user.id')),
db.Column('role\u id',db.Integer,db.ForeignKey('role.id'))

我试图通过显式设置table name来覆盖tablename,但它仍然遵循默认的单数名称。@KevinQ您是否可以共享演示此问题的示例代码?