2015-11-04 1 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() 

После добавления нового столбца address, для которого null=True, я делаю некоторые вставки в измененном базу данных. Я ожидаю увидеть данные адреса в поле 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

Смежные вопросы