2015-11-04 44 views
0

我正在使用peewee模塊管理Sqlite數據庫中的數據。我的用例場景是我將創建一個包含特定字段的數據庫。我還需要在某些時候將列添加到現有數據庫中。下面是我的代碼,應該按預期工作:新列插入後peewee無法插入數據

from peewee import * 
import os 
from playhouse.migrate import * 

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

class FirstTable(Model): 
    first_name = CharField(null=True) 
    last_name = CharField(null=True) 

    class Meta: 
     database = my_db 

class Checkit: 

    def __init__(self): 
     self.db = my_db 
     self.migrator = migrator 

    def makeDatabse(self): 
     if os.path.exists("my_database.db"): 
      print "File Exists remove it" 
      os.remove("my_database.db") 
     try: 
      self.db.connect() 
      self.db.create_tables([FirstTable,]) 
     except OperationalError: 
      print "Table Exists" 

    def insertDatas(self): 
     with self.db.atomic(): 
      for i in range(10): 
       first_name_ = "Hello " + str(i) 
       last_name_ = "World " + str(i) 
       db_ = FirstTable(first_name=first_name_, last_name = last_name_) 
       db_.save() 

    def alterDatabase(self, columns): 
     with self.db.transaction(): 
      columnField = CharField(null=True) 
      for column in columns:    
       migrate(migrator.add_column("firsttable", column, columnField)) 

    def insertAfterAlteringDatabase(self): 
     with self.db.atomic(): 
      for i in range(20,30): 
       first_name_ = "Hello " + str(i) 
       last_name_ = "World " + str(i) 
       address_ = "Address " + str(i) 
       db_ = FirstTable(first_name=first_name_, last_name = last_name_, address=address_) 
       db_.save() 

ch = Checkit() 
ch.makeDatabse() 
ch.insertDatas() 
ch.alterDatabase(["address"]) 
ch.insertAfterAlteringDatabase() 

增加了其null=True新列address後,我做了一些插入數據庫的改變。我期望看到地址數據到address字段,但我沒有得到任何這些數據。相反它是NULL。我的代碼應該可以正常工作,但不能按預期工作。這裏有什麼問題?

回答

1

在您的insertAfterAlteringDatabase中,您需要將新字段添加到模型中。遷移者將添加到數據庫表,但它沒有將字段添加到模型類。要做到這一點,你可以:

def alterDatabase(self, columns): 
    with self.db.transaction(): 
     columnField = CharField(null=True) 
     for column in columns:    
      migrate(migrator.add_column("firsttable", column, columnField)) 
     columnField.add_to_class(FirstTable, column) # Add the field to the model. 
+0

這似乎是個竅門。我認爲添加代碼的縮進是錯誤的。它不應該在循環內嗎?謝謝。 – Pant