Peewee V3.17 migrator.drop_column 方法不起作用

问题描述 投票:0回答:1

尝试删除 Sqlite DB 中表的列失败,并显示:

文件“/home/.../venv/lib/python3.11/site-packages/peewee.py”,第3252行,在execute_sql中 光标.execute(sql, params 或 ()) peewee.OperationalError:靠近“DROP”:语法错误

小便==3.17.0 fastapi==0.109.0

测试代码

# db.py
from peewee import *
from playhouse.migrate import *


db = SqliteDatabase('people.db')


class Person(Model):
    name = CharField()
    date_of_birth = DateField()
    age = SmallIntegerField()

    class Meta:
        database = db


class Pet(Model):
    owner = ForeignKeyField(Person, backref='pets')
    name = CharField()
    animal_type = CharField()

    class Meta:
        database = db


db.connect()
db.create_tables([Person, Pet])

migrator = SqliteMigrator(db)
migrate(
    migrator.drop_column(
        Person._meta.table_name,
        "date_of_birth"
    ),
)
db.close()

我使用 FastAPI 并使用以下命令进行迁移(只需运行 fastapi 服务器)

uvicorn main:app --reload

migrator 的 rename_column, add_column, ... 方法有效 我还不知道使用 Peewee 迁移的正确方法(文件夹、文件结构,例如 djangoORM)

python sqlite migration fastapi peewee
1个回答
0
投票
对 drop 列的 sqlite 支持的版本检查存在错误。我把它设置为 3.25,但实际上直到 3.35 才添加 DROP,这就是您看到错误的原因。感谢您报告这一点,

.drop_column(..., legacy=True)

 应该会继续工作,直到您引入此补丁 - 
legacy=True
 所做的是解决 Sqlite 的 ALTER TABLE 支持中的限制:

    创建一个具有所需架构的新表
  1. 将所有数据复制到新表中
  2. 删除原来的表
  3. 将新表重命名为原始表的名称。
© www.soinside.com 2019 - 2024. All rights reserved.