2015-07-04 36 views
-1

我從互聯網上的某個地方複製了這段代碼,我試圖從一些視頻教程中學習python,並且發現了這段代碼..當我試圖用python2編譯它時0.7公司errroAttributeError:數據庫實例沒有屬性'_db'

ERROR-OUTPUT如下

In [23]: %run "C:\Users\Developer\Canopy\DevDir\aaa.py"

Create table test 
AttributeError Traceback (most recent call last) 

C:\Users\Developer\Canopy\DevDir\aaa.py in <module>() 
    101  for row in db: print(row) 
    102 
--> 103 if __name__ == "__main__": main() 

C:\Users\Developer\Canopy\DevDir\aaa.py in main() 
    78 
    79  print('Create table test') 
---> 80  db.sql_do('drop table if exists test') 
    81  db.sql_do('create table test (t1 text, i1 int)') 
    82 

C:\Users\Developer\Canopy\DevDir\aaa.py in sql_do(self, sql, *params) 
    13 
    14  def sql_do(self, sql, *params): 
---> 15   self._db.execute(sql, params) 
    16   self._db.commit() 
    17 

AttributeError: database instance has no attribute '_db' 

代碼

#!/usr/bin/python3 

import sqlite3 

class database: 
    def __init__(self, **kwargs): 
     self.filename = kwargs.get('filename') 
     self.table = kwargs.get('table', 'test') 

    def sql_do(self, sql, *params): 
     self._db.execute(sql, params) 
     self._db.commit() 

    def insert(self, row): 
     self._db.execute('insert into {} (t1, i1) values (?, ?)'.format(self._table), (row['t1'], row['i1'])) 
     self._db.commit() 

    def retrieve(self, key): 
     cursor = self._db.execute('select * from {} where t1 = ?'.format(self._table), (key,)) 
     return dict(cursor.fetchone()) 

    def update(self, row): 
     self._db.execute(
      'update {} set i1 = ? where t1 = ?'.format(self._table), 
      (row['i1'], row['t1'])) 
     self._db.commit() 

    def delete(self, key): 
     self._db.execute('delete from {} where t1 = ?'.format(self._table), (key,)) 
     self._db.commit() 

    def disp_rows(self): 
     cursor = self._db.execute('select * from {} order by t1'.format(self._table)) 
     for row in cursor: 
      print(' {}: {}'.format(row['t1'], row['i1'])) 

    def __iter__(self): 
     cursor = self._db.execute('select * from {} order by t1'.format(self._table)) 
     for row in cursor: 
      yield dict(row) 

    @property 
    def filename(self): 
     return self._filename 

    @filename.setter 
    def filename(self, fn): 
     self._filename = fn 
     self._db = sqlite3.connect(fn) 
     self._db.row_factory = sqlite3.Row 

    @filename.deleter 
    def filename(self): self.close() 

    @property 
    def table(self): return self._table 
    @table.setter 
    def table(self, t): self._table = t 
    @table.deleter 
    def table(self): self._table = 'test' 

    def close(self): 
      self._db.close() 
      del self._filename 

def main(): 
    db = database(filename = 'test.db', table = 'test') 

    print('Create table test') 
    db.sql_do('drop table if exists test') 
    db.sql_do('create table test (t1 text, i1 int)') 

    print('Create rows') 
    db.insert(dict(t1 = 'one', i1 = 1)) 
    db.insert(dict(t1 = 'two', i1 = 2)) 
    db.insert(dict(t1 = 'three', i1 = 3)) 
    db.insert(dict(t1 = 'four', i1 = 4)) 
    for row in db: print(row) 

    print('Retrieve rows') 
    print(db.retrieve('one'), db.retrieve('two')) 

    print('Update rows') 
    db.update(dict(t1 = 'one', i1 = 101)) 
    db.update(dict(t1 = 'three', i1 = 103)) 
    for row in db: print(row) 

    print('Delete rows') 
    db.delete('one') 
    db.delete('three') 
    for row in db: print(row) 

if __name__ == "__main__": main() 

There is no indention error I am not able to figure out how to make it work Any Help ?

+0

'self._db'是一個指向數據庫連接的類變量。但你從來沒有分配它!即您尚未打開數據庫並將其分配給此變量。 –

+0

@DovGrobgeld先生,我應該做些什麼改變才能使之發揮作用? – KodeCeeper

+1

適合我... @Dov Grobgeld:是的,它是設置,但以一種複雜的方式:通過文件名設置... –

回答

1

在python2.7性能不太優雅(這是不太好編程IMHO。在構造函數中定義所有成員通常是很好的做法;等等):

import sqlite3 

class database: 
    def __init__(self, **kwargs): 
     self._set_filename(kwargs.get('filename')) 
     self._set_table(kwargs.get('table', 'test')) 

    def sql_do(self, sql, *params): 
     self._db.execute(sql, params) 
     self._db.commit() 

    def insert(self, row): 
     self._db.execute('insert into {} (t1, i1) values (?, ?)'.format(self._table), (row['t1'], row['i1'])) 
     self._db.commit() 

    def retrieve(self, key): 
     cursor = self._db.execute('select * from {} where t1 = ?'.format(self._table), (key,))   print 'SETTER' 
     return dict(cursor.fetchone()) 

    def update(self, row): 
     self._db.execute(
      'update {} set i1 = ? where t1 = ?'.format(self._table), 
      (row['i1'], row['t1'])) 
     self._db.commit() 

    def delete(self, key): 
     self._db.execute('delete from {} where t1 = ?'.format(self._table), (key,)) 
     self._db.commit() 

    def disp_rows(self): 
     cursor = self._db.execute('select * from {} order by t1'.format(self._table)) 
     for row in cursor: 
      print(' {}: {}'.format(row['t1'], row['i1'])) 

    def __iter__(self): 
     cursor = self._db.execute('select * from {} order by t1'.format(self._table)) 
     for row in cursor: 
      yield dict(row) 

    def _get_filename(self): 
     return self._filename 

    def _set_filename(self, fn): 
     self._filename = fn 
     self._db = sqlite3.connect(fn) 
     self._db.row_factory = sqlite3.Row 

    def _del_filename(self): self.close() 

    filename = property(_get_filename, _set_filename, _del_filename) 


    def _get_table(self): return self._table 
    def _set_table(self, t): self._table = t 
    def _del_table(self): self._table = 'test' 

    table = property(_get_table, _set_table, _del_table) 

    def close(self): 
      self._db.close() 
      del self._filename 

def main(): 
    db = database(filename = 'test.db', table = 'test') 

    print('Create table test') 
    db.sql_do('drop table if exists test') 
    db.sql_do('create table test (t1 text, i1 int)') 

    print('Create rows') 
    db.insert(dict(t1 = 'one', i1 = 1)) 
    db.insert(dict(t1 = 'two', i1 = 2)) 
    db.insert(dict(t1 = 'three', i1 = 3)) 
    db.insert(dict(t1 = 'four', i1 = 4)) 
    for row in db: print(row) 

    print('Retrieve rows') 
    print(db.retrieve('one'), db.retrieve('two')) 

    print('Update rows') 
    db.update(dict(t1 = 'one', i1 = 101)) 
    db.update(dict(t1 = 'three', i1 = 103)) 
    for row in db: print(row) 

    print('Delete rows') 
    db.delete('one') 
    db.delete('three') 
    for row in db: print(row) 

if __name__ == "__main__": main() 
相關問題