【问题标题】:How to use `migrate()` in Peewee如何在 Peewee 中使用 `migrate()`
【发布时间】:2021-06-29 20:12:50
【问题描述】:

我是 peewee 的新手,我对迁移非常困惑。我尝试了官方文档中的例子,得到的结果如下:

from playhouse.migrate import *
from peewee import *

my_db = SqliteDatabase('my_database.db')
migrator = SqliteMigrator(my_db)

from peewee import *

database = SqliteDatabase('my_database.db')

class BaseModel(Model):
    class Meta:
        database = database

class Product(BaseModel):
    name = TextField()

    class Meta:
        table_name = 'product'

with my_db:
    my_db.create_tables([Product,])

Product.create(name = 'Big Peach')

price_field = IntegerField(default=0)
migrate(migrator.add_column('product', 'price', price_field))
db = migrator.database
columns = db.get_columns('product')
print(columns)

这是我得到的并添加了“价格”字段,表明migrated ()做得很好:

[ColumnMetadata(name='id', data_type='INTEGER', null=False, primary_key=True, table='product', default=None), ColumnMetadata(name='name', data_type='TEXT', null=False, primary_key=False, table='product', default=None), ColumnMetadata(name='price', data_type='INTEGER', null=False, primary_key=False, table='product', default=None)]

现在的问题是当我打电话给Product.price时,

query = Product.get(Product.name == 'Big Peach')
print(query.price)

出现如下结果:

“产品”对象没有属性“价格”

我在命令行中尝试了另一种方法:

python -m pwiz -e sqlite my_database.db

我知道了:

from peewee import *

database = SqliteDatabase('my_database.db')

class UnknownField(object):
    def __init__(self, *_, **__): pass

class BaseModel(Model):
    class Meta:
        database = database

class Product(BaseModel):
    name = CharField()
    price = IntegerField()

    class Meta:
        table_name = 'product'   

我可以使用这些来替换以前的模型,但不需要migrate()。 所以,我的困惑是如何在一个.py 文件中调用使用migrate() 添加的新字段。

【问题讨论】:

    标签: python peewee migrate


    【解决方案1】:

    在网上这样做很不寻常:

    1. 声明模型/模式
    2. 迁移它
    3. 使用新架构

    因为如果您知道需要价格字段,只需从一开始就将其放在模型类中。

    如果您确实需要这样做,那么您可以在运行迁移后调用它:

    Product._meta.add_field('price', price_field)
    

    【讨论】:

    • 谢谢@coleifer,我刚刚开始学习数据库。现在我明白了什么是数据迁移了。
    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 2012-06-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    相关资源
    最近更新 更多