我想在我的 Flask 项目上做一个非常简单的任务,更改我现有的 sqlite 列名称。但不幸的是,它总是给出错误结果。
这是我的模型.py
class User(db.Model, UserMixin):
id = db.Column(db.Integer(), primary_key=True, autoincrement=True)
username = db.Column(db.String(length=30), nullable=False, unique=True)
name = db.Column(db.String(length=40))
email = db.Column(db.String(length=50),
nullable=False, unique=True)
kuota = db.Column(db.Integer(), nullable=False, default=0)
license_keys = db.relationship(
'License_Key', backref='owned_user', lazy=True)
我只想将“kuota”列更改为“point”
这就是我一直在努力做的事情
在数据库初始化时添加命名约定元数据并将 render_as_batch 设置为 true
metadata = MetaData(
naming_convention={
'pk': 'pk_%(table_name)s',
'fk': 'fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s',
'ix': 'ix_%(table_name)s_%(column_0_name)s',
'uq': 'uq_%(table_name)s_%(column_0_name)s',
'ck': 'ck_%(table_name)s_%(constraint_name)s',
}
)
db = SQLAlchemy(app, metadata=metadata)
migrate = Migrate(app, db, render_as_batch=True)
我得到如下错误
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed: _alembic_tmp_user.poin
[SQL: INSERT INTO _alembic_tmp_user (id, username, name, email) SELECT user.id, user.username, user.name, user.email
FROM user]
只添加 render_as_batch 为真,没有命名约定
这是版本控制文件的样子:
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('user', schema=None) as batch_op:
batch_op.add_column(sa.Column('kuota', sa.Integer(), nullable=False))
batch_op.drop_column('poin')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('user', schema=None) as batch_op:
batch_op.add_column(sa.Column('poin', sa.INTEGER(), nullable=False))
batch_op.drop_column('kuota')
它仍然给我一个错误
NOT NULL constraint failed: _alembic_tmp_user.poin
[SQL: INSERT INTO _alembic_tmp_user (id, username, name, email) SELECT user.id, user.username, user.name, user.email
FROM user]
如何在 Flask 上完成这个简单的 sqlite 重命名列名称任务?