如何在 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)
下面是我得到的,增加了'price'的字段,说明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)
出现如下结果:
'Product' object has no attribute '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()
添加的新字段。
在线执行此操作很不寻常:
- 声明一个model/schema
- 迁移它
- 使用新架构
因为如果您知道需要价格字段,只需从一开始就将其放在模型中 class。
如果您确实需要这样做,那么您可以在 运行 迁移之后调用它:
Product._meta.add_field('price', price_field)
我是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)
下面是我得到的,增加了'price'的字段,说明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)
出现如下结果:
'Product' object has no attribute '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()
添加的新字段。
在线执行此操作很不寻常:
- 声明一个model/schema
- 迁移它
- 使用新架构
因为如果您知道需要价格字段,只需从一开始就将其放在模型中 class。
如果您确实需要这样做,那么您可以在 运行 迁移之后调用它:
Product._meta.add_field('price', price_field)