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

时间:2016-01-15 08:46:47

标签: 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)

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

1 个答案:

答案 0 :(得分:14)

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

您希望alembic进行迁移,可能需要Flask-Migrate

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

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