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()
我有一个 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
.
这是我的解决方案。
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()