gpt4 book ai didi

python-3.x - Flask-migrate:更改模型属性并重命名相应的数据库列

转载 作者:行者123 更新时间:2023-12-02 22:54:49 24 4
gpt4 key购买 nike

我对 Flask 有一点经验,但对数据库(Flask-migrate/alembic/SqlAlchemy)不太了解。

我正在关注this教程和一切都运行得很好。

我有一个这样的用户模型:

# user_model.py

from app import DB
... other imports

class User(UserMixin, DB.Model):

__tablename__ = 'users'
id = DB.Column(DB.Integer, primary_key=True)
username = DB.Column(DB.String(64), index=True, unique=True)
email = DB.Column(DB.String(120), index=True, unique=True)
password_hash = DB.Column(DB.String(128))

然后我可以初始化数据库,进行迁移、升级等。

当我想更改 id 属性时,问题就开始了,这在 Python 中并不是一个很好的变量名称选择。假设我想将其重命名为 user_id

现在显然数据库已经存在并且里面有一些数据。我想也许通过 Flask-Migrate/Alembic 的某种魔法,只需修改 User 类就可以了。只需将上面的 id 行更改为:

user_id = DB.Column(DB.Integer, primary_key=True)

如果我这样做并运行flask db migrate我得到:

INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added column 'users.user_id'
INFO [alembic.autogenerate.compare] Detected removed column 'users.id'

所以实际上 Alembic 检测到这是一列被删除并添加了一个新列,我认为这是有道理的。

但实际上,如果我运行flask db update,这实际上不起作用。我收到以下错误:

ERROR [alembic.env] (sqlite3.OperationalError) Cannot add a NOT NULL column with default value NULL [SQL: 'ALTER TABLE users ADD COLUMN user_id INTEGER NOT NULL']

这个错误非常明显。重点是我不想添加新列,我只想重命名现有列。

环顾四周,我还尝试修改处理升级的 script.py 以使用 alter_column 方法:

def upgrade():
${upgrades if upgrades else "pass"}
# just added this line below
op.alter_column('users', 'id', nullable=False, new_column_name='user_id')

但是这似乎也不起作用(我得到了与上面相同的错误)。

所以问题归结为一个非常简单的问题:如何使用 Flask-Migrate 重命名 Flask 应用程序中的数据库列?或者换句话说,如果我想修改给定模型的属性,我必须做什么才能正确重命名数据库中相应的列名?

最佳答案

要简单地重命名alembic脚本中的列(与flask-migrate相同),您所做的是正确的:

op.alter_column('users', 'id', nullable=False, new_column_name='user_id')

在我看来,问题来自于您还需要将其约束更改为主键:

op.drop_constraint('user_pkey', 'users', type_='primarykey')
op.create_primary_key('user_pkey', 'users', ['user_id'])

您可能需要根据您的数据库类型调整重新创建的主键的名称(对于我来说,使用 PostgreSQL 是这样的)

应始终审查自动生成的 alembic 脚本,如果不是简单的更改,它们通常不会执行我们想要的操作。

注意:如果您的列 id 被用作外键,您可能还需要更改其他表中的外键约束。

Alter Primary Key in Alembic描述了同类问题。

关于python-3.x - Flask-migrate:更改模型属性并重命名相应的数据库列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56015921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com