2015-11-04 85 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