簡體   English   中英

如何在 Peewee 中使用 `migrate()`

[英]How to use `migrate()` in Peewee

我是 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)

出現以下結果:

“產品” object 沒有屬性“價格”

我在命令行中嘗試了另一種方法:

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'   

我可以用這些來替換之前的 Model,但是不需要migrate() 所以,我的困惑是如何在一個.py文件中調用使用migrate()添加的新字段。

在線執行此操作很不尋常:

  1. 聲明模型/模式
  2. 遷移它
  3. 使用新架構

因為如果您知道您需要一個價格字段,只需從一開始就將其放在 model class 上。

如果您真的需要這樣做,那么您可以在運行遷移后調用它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM