我正在使用 SQLAlchemy,并且我有以下代码:
型号:
class User(db.Model):
__tablename__ = 'user'
__table_args__ = {'schema': 'task', 'useexisting': True}
id = Column(Integer, primary_key=True, autoincrement=True)
firstname = Column(String)
.env
SQLALCHEMY_DATABASE_URI = os.getenv('SQLALCHEMY_DATABASE_URI')
app.py
def create_app(config_file):
"""Create a Flask application using the app factory pattern."""
app = Flask(__name__)
"""Load configuration."""
app.config.from_pyfile(config_file)
"""Init app extensions."""
from .extensions import db
db.init_app(app)
如果 SQLite 文件不存在,则会创建它,但不会创建每个模型的表。
问题是我该怎么做才能为每个模型创建表?
最佳答案
只需添加:
db.create_all()
在 app.py
末尾的 create_app()
中。
create_all()
只会在表不存在时创建表,并且不会更改之前创建的表。
如果您想从命令行创建数据库和表,您只需键入:
python
from app.py import db
db.create_all()
exit()
工作示例:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.secret_key = "Secret key"
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///my_database.sqlite3"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db = SQLAlchemy(app)
class Data(db.Model):
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(50))
email = db.Column(db.String(50))
phone = db.Column(db.String(50))
db.create_all()
# add a row
# comment out after the 1st run
table_row = Data(name="My Name", email="myemail@mail.com", phone="123456")
db.session.add(table_row)
db.session.commit()
print "A row was added to the table"
# read the data
row = Data.query.filter_by(name="My Name").first()
print "Found:", row.email, row.phone
if __name__ == "__main__":
app.run(debug=True)
这适用于 Python 2.7,要在 Python 3.x 上运行,只需更改 print
语句以调用 print()
函数。
注意:
使用自动模型类构造函数时,传递给模型类构造函数的参数必须是keyword
参数,否则会出错。否则,您可以像这样覆盖 Data()
类中的 __init__()
:
def __init__(self, name, email, phone, **kwargs):
super(Data, self).__init__(**kwargs)
self.name = name
self.email = email
self.phone = phone
在这种情况下,您不必使用 keyword
参数。
关于python - 如果 Flask 上不存在表,如何使用 SQLAlchemy 创建表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62741661/