SQLAlchemy create_all() 无法创建新表

SQLAlchemy create_all() unable to create new tables

我有一个 Flask Web 应用程序,它使用 mysql db using flask-sqlalchemy。

我为 DDL 创建保留了单独的实用程序脚本。

我现有的应用程序运行良好,但此脚本无法创建新的 table。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import connect_strng
    
app = Flask(__name__)
    
app.config['SQLALCHEMY_DATABASE_URI'] = connect_string

db = SQLAlchemy()

# Added this import just before create_all
from db_models import Test

db.create_all()
db.session.commit()

我在里面定义了模型db_models

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Test(db.Model):
    __tablename__ = 'test'
    
    test_id = db.Column(db.Integer, primary_key=True)
    

我的脚本以退出代码 0 结束,表示没有错误,但我没有看到 mysql 数据库中生成了 table。

$ python create_table.py 
$ echo $?
0

我检查了 answer 类似的问题,但没有成功。

您需要在整个应用中使用相同的 db 对象。在需要的地方导入它。

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy() # <--- This is what is causing your issue
# IT should look something more like...
from create_table import db


class Test(db.Model):
    __tablename__ = 'test'
    
    test_id = db.Column(db.Integer, primary_key=True)

不过上面的建议有个问题...会导致循环导入。要解决这个问题,需要稍微重组您的应用程序。具体怎么做取决于你,但我会给你一个建议。

创建一个名为 database.py 的新文件并将您的 db 对象放入其中。然后你可以在你需要 db.

的时候做 from database import db

database.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

至于如何构建您的应用程序,请考虑 application factory 模式。它考虑到了 flask 经常出现的循环导入问题。

我能够通过使用烧瓶的 application context.

解决问题

正如@noslenkwah 所说,您应该通过定义到单个文件 database.py.

从单个位置使用 db 对象

这是我的解决方案。

database.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

db_models.py

from database import db

class Test(db.Model):
    __tablename__ = 'test'
    
    test_id = db.Column(db.Integer, primary_key=True)

create_table.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import connect_strng
from database import db
    
app = Flask(__name__)
    
app.config['SQLALCHEMY_DATABASE_URI'] = connect_string


with app.app_context():
    db.init_app(app)
    # Added this import just beore create_all
    from db_models import Test, CrawlStat
    db.create_all()
    db.session.commit()