为什么SQLalchemy create_all()可以重用?

ret*_*n 0 6 python sqlite flask

我对数据库和SQLalchemy/sqlite3的背景知识很少,但我的实验告诉我,create_all()几乎可以像"初始化数据库(如果它已经存在)"一样使用.

这是我写的flask webapp的"表单提交"部分:

db = SQLAlchemy(app)
@app.route('/submit', methods=['POST'])
def submit():
    form = UserForm(request.form)
    if request.method == 'POST':
        new_entry = User(form.username.data,
                         form.password.data)
        db.create_all()
        add_entry(new_entry)
Run Code Online (Sandbox Code Playgroud)

db.create_all()应创建本地.db文件.如果我已经拥有该文件,并且我向表单提交了新数据,那么会发生的事情new_entry是附加到数据库表而不是覆盖该.db文件.任何人都可以确认这个结果是预期的吗?如果执行得不好,处理数据库初始化的更好方法是什么?

Thi*_*ter 15

create_all确实只创建了不存在的表.它不适用于迁移,而是在空数据库中创建初始结构.

您可能希望使用alembic进行迁移,可能是通过Flask-Migrate进行迁移


除此之外,在Flask应用程序的面向Web的部分中使用任何与数据库结构相关的代码都是值得怀疑的.通常,您可以在命令行工具中执行此类操作(通过Flask-Script或单击),例如python manage.py create_db.

我不同意你对"执行不力"的看法.它的实现方式可以阻止你做错(也可能是危险的)事情.想象一下,您重命名一列.一个"聪明的" create_all将DROP旧的列(它毕竟已经消失)并创建一个新的列 - 任何工具都不可能知道你重命名它而不是删除和添加一个.

  • 通常,您不希望从Web界面执行数据库结构修改.这是你在部署(新)版本后通常会做的事情(你也不是通过网络做的) (2认同)