├── .gitignore ├── README.md └── db.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.dat 3 | *.swp 4 | *.DS_Store 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Database Interaction Layer for sqlite3 in python 2 | -------------------------------------------------------------------------------- /db.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | 3 | 4 | queries = { 5 | 'SELECT': 'SELECT %s FROM %s WHERE %s', 6 | 'SELECT_ALL': 'SELECT %s FROM %s', 7 | 'INSERT': 'INSERT INTO %s VALUES(%s)', 8 | 'UPDATE': 'UPDATE %s SET %s WHERE %s', 9 | 'DELETE': 'DELETE FROM %s where %s', 10 | 'DELETE_ALL': 'DELETE FROM %s', 11 | 'CREATE_TABLE': 'CREATE TABLE IF NOT EXISTS %s(%s)', 12 | 'DROP_TABLE': 'DROP TABLE %s'} 13 | 14 | 15 | class DatabaseObject(object): 16 | 17 | def __init__(self, data_file): 18 | self.db = sqlite3.connect(data_file, check_same_thread=False) 19 | self.data_file = data_file 20 | 21 | def free(self, cursor): 22 | cursor.close() 23 | 24 | def write(self, query, values=None): 25 | cursor = self.db.cursor() 26 | if values is not None: 27 | cursor.execute(query, list(values)) 28 | else: 29 | cursor.execute(query) 30 | self.db.commit() 31 | return cursor 32 | 33 | def read(self, query, values=None): 34 | cursor = self.db.cursor() 35 | if values is not None: 36 | cursor.execute(query, list(values)) 37 | else: 38 | cursor.execute(query) 39 | return cursor 40 | 41 | def select(self, tables, *args, **kwargs): 42 | vals = ','.join([l for l in args]) 43 | locs = ','.join(tables) 44 | conds = ' and '.join(['%s=?' % k for k in kwargs]) 45 | subs = [kwargs[k] for k in kwargs] 46 | query = queries['SELECT'] % (vals, locs, conds) 47 | return self.read(query, subs) 48 | 49 | def select_all(self, tables, *args): 50 | vals = ','.join([l for l in args]) 51 | locs = ','.join(tables) 52 | query = queries['SELECT_ALL'] % (vals, locs) 53 | return self.read(query) 54 | 55 | def insert(self, table_name, *args): 56 | values = ','.join(['?' for l in args]) 57 | query = queries['INSERT'] % (table_name, values) 58 | return self.write(query, args) 59 | 60 | def update(self, table_name, set_args, **kwargs): 61 | updates = ','.join(['%s=?' % k for k in set_args]) 62 | conds = ' and '.join(['%s=?' % k for k in kwargs]) 63 | vals = [set_args[k] for k in set_args] 64 | subs = [kwargs[k] for k in kwargs] 65 | query = queries['UPDATE'] % (table_name, updates, conds) 66 | return self.write(query, vals + subs) 67 | 68 | def delete(self, table_name, **kwargs): 69 | conds = ' and '.join(['%s=?' % k for k in kwargs]) 70 | subs = [kwargs[k] for k in kwargs] 71 | query = queries['DELETE'] % (table_name, conds) 72 | return self.write(query, subs) 73 | 74 | def delete_all(self, table_name): 75 | query = queries['DELETE_ALL'] % table_name 76 | return self.write(query) 77 | 78 | def create_table(self, table_name, values): 79 | query = queries['CREATE_TABLE'] % (table_name, ','.join(values)) 80 | self.free(self.write(query)) 81 | 82 | def drop_table(self, table_name): 83 | query = queries['DROP_TABLE'] % table_name 84 | self.free(self.write(query)) 85 | 86 | def disconnect(self): 87 | self.db.close() 88 | 89 | 90 | class Table(DatabaseObject): 91 | 92 | def __init__(self, data_file, table_name, values): 93 | super(Table, self).__init__(data_file) 94 | self.create_table(table_name, values) 95 | self.table_name = table_name 96 | 97 | def select(self, *args, **kwargs): 98 | return super(Table, self).select([self.table_name], *args, **kwargs) 99 | 100 | def select_all(self, *args): 101 | return super(Table, self).select_all([self.table_name], *args) 102 | 103 | def insert(self, *args): 104 | return super(Table, self).insert(self.table_name, *args) 105 | 106 | def update(self, set_args, **kwargs): 107 | return super(Table, self).update(self.table_name, set_args, **kwargs) 108 | 109 | def delete(self, **kwargs): 110 | return super(Table, self).delete(self.table_name, **kwargs) 111 | 112 | def delete_all(self): 113 | return super(Table, self).delete_all(self.table_name) 114 | 115 | def drop(self): 116 | return super(Table, self).drop_table(self.table_name) 117 | 118 | 119 | class User(Table): 120 | 121 | def __init__(self, data_file): 122 | super(User, self).__init__(data_file, 'users', 123 | ['username TEXT', 'password TEXT']) 124 | 125 | def select(self, *args, **kwargs): 126 | cursor = super(User, self).select(*args, **kwargs) 127 | results = cursor.fetchall() 128 | cursor.close() 129 | return results 130 | 131 | def insert(self, *args): 132 | self.free(super(User, self).insert(*args)) 133 | 134 | def update(self, set_args, **kwargs): 135 | self.free(super(User, self).update(set_args, **kwargs)) 136 | 137 | def delete(self, **kwargs): 138 | self.free(super(User, self).delete(**kwargs)) 139 | 140 | def delete_all(self): 141 | self.free(super(User, self).delete_all()) 142 | 143 | def drop(self): 144 | self.free(super(User, self).drop()) 145 | 146 | def exists(self, username): 147 | results = self.select('username', username=username) 148 | return len(results) > 0 149 | 150 | def authenticate(self, username, password): 151 | results = self.select('username', username=username, 152 | password=password) 153 | return len(results) > 0 154 | 155 | if __name__ == '__main__': 156 | user = User('test.dat') 157 | user.delete_all() 158 | user.insert('ben', 'attal') 159 | user.insert('hello', 'world') 160 | cursor = user.select_all('*') 161 | print cursor.fetchall() 162 | cursor.close() 163 | --------------------------------------------------------------------------------