2013-03-21 3 views
0

Это мой первый опыт использования sqlite3 через наследование классов, и я столкнулся с проблемой, когда у меня нет ошибок трассировки, но выполняемые мной запросы не будут выполняться. Я упростили мой кодsqlite3.Connection class inheritance, commit not working

import sqlite3 as lite 

class BaseModel(lite.Connection): 
    def __init__(self, **args): 
     lite.Connection.__init__(self, **args) 
     self.cur = self.cursor() 

    def execute(self, query): 
     self.cur.execute(query) 




class Model(BaseModel): 
    def __init__(self, **args): 
     BaseModel.__init__(self, **args) 

    def _new_(self): 
     queries = []   
     queries.append(' '.join(['CREATE TABLE IF NOT EXISTS tb1', 
         '(id INTEGER PRIMARY KEY,', 
         'column1 TEXT,', 
         'column2 INT)'])) 

     for q in queries: 
      self.execute(q) # execute the queries 

     self.commit() # write changes to db 

    def tables(self): 
     query = 'SELECT name FROM sqlite_master WHERE type="table" ORDER BY name' 
     results = self.execute(query) 
     return results#.fetchall() 



if __name__ == '__main__': 
    model = Model(database='test.db') 
    model._new_() 

    # Test Fails because the queries aren't being saved in the db 
    # see Model.__new__ for details 

    tables = model.tables() # get all tables 

    print 'Tables Created:' 

    if tables: 
     for t in model.tables(): 
      print '\t%s' % str(t[0]) 
    else: print tables 
+1

Обычно, это '__new__', не' _new_', но я подозреваю, что было преднамеренным. Это делает ваш код довольно запутанным для разбора. –

+0

Извините, на самом деле я не думал об этом. – Crispy

+0

См. [Основная настройка] (http://docs.python.org/2/reference/datamodel.html#basic-customization), но я думаю, что вы действительно не хотите или должны использовать '__new__' в этом случае. –

ответ

2

Вы должны вызоваself.commit():

self.commit() # write changes to db 

Без () вы просто ссылки метода, не вызывая его.

Далее ваша execute() функция ничего не возвращает:

def execute(self, query): 
    return self.cur.execute(query) 
+0

ха-ха, спасибо, я тотально пропустил это. Полагаю, иногда вам нужен кто-то, чтобы указать на очевидное. – Crispy

+0

Спасибо, что указали это, но код dosn't, похоже, не отличается. – Crispy

+0

ха-ха вау. Хорошо, спасибо. – Crispy