Saya baru di Peewee dan saya sangat bingung tentang migrasi. Saya mencoba contoh-contoh dalam dokumentasi resmi, dan saya mendapat hasilnya sebagai berikut:

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)

Inilah yang saya dapatkan dan bidang 'harga' ditambahkan, menunjukkan bahwa migrated () baik-baik saja:

[Kolommetadata (nama = 'id', data_type = 'integer', null = false, primer_key = true = 'produk', default = tidak ada), kolommetadata (nama ', null =' notherpe = False, primer_key = false, table = 'produk', default = tidak ada), kolommetadata (nama = 'harga', data_type = 'bilangan bulat', null = false_key = 'produk', default = '

Sekarang masalahnya adalah ketika saya menelepon Product.price,

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

Hasil berikut muncul:

Objek 'produk' tidak memiliki atribut 'harga'

Saya sudah mencoba cara lain untuk melakukan ini, di baris perintah:

python -m pwiz -e sqlite my_database.db

Saya mengerti:

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'   

Saya dapat menggunakan ini untuk mengganti model sebelumnya, tetapi tidak perlu migrate(). Jadi, kebingungan saya adalah bagaimana memanggil bidang baru yang ditambahkan dengan menggunakan migrate() dalam file satu .py.

1
watalo 3 April 2021, 08:42

1 menjawab

Jawaban Terbaik

Tidak biasa melakukan ini secara online:

  1. mendeklarasikan model / skema
  2. Migrasikannya
  3. gunakan skema baru

Karena jika Anda tahu Anda perlu bidang harga, cukup letakkan di kelas model dari awal.

Jika Anda benar-benar perlu melakukan ini, maka Anda dapat menelepon ini setelah Anda menjalankan migrasi:

Product._meta.add_field('price', price_field)
0
coleifer 4 April 2021, 17:15