· 5 years ago · May 03, 2020, 07:26 PM
1import sqlite3
2
3def command(func):
4 def wrapper(self, *args, **kwargs):
5 cursor = self._get_connection().cursor() # открываем курсор
6 res = func(self, *args, cursor=cursor, **kwargs) # выполняем функцию
7 self._get_connection().commit() # коммит, если он нужен
8 cursor.close() # Не забываем закрывать курсор
9 return res
10 return wrapper
11
12# FIXME: лучше так. Учимся пользоваться объектами и открывать соединение к базе один раз, а не на каждый запрос
13# Пример класса клиента базы, повторяющийся код выносим в отдельные методы
14class DbHelper():
15 def __init__(self, db_name: str):
16 self.db_name = db_name
17 self._connection = None # connection object
18
19
20 def _get_connection(self):
21 if not self._connection: # ленивая инициализация соединения
22 self._connection = sqlite3.connect(self.db_name)
23 return self._connection
24
25
26 def __del__(self):
27 if self._connection: # закрытие соединения при удалении объекта как пример безопасной работы
28 self._connection.close()
29
30 @command
31 def init_db(self, cursor, force: bool=False):
32 if force:
33 cursor.execute('DROP TABLE IF EXISTS user_like')
34 cursor.execute('DROP TABLE IF EXISTS autor_info')
35 cursor.execute('DROP TABLE IF EXISTS user_chat_id')
36 self._connection.commit()
37
38 cursor.execute('''
39 CREATE TABLE IF NOT EXISTS user_like (
40 id INTEGER PRIMARY KEY,
41 user_id INTEGER NOT NULL,
42 message_id INTEGER NOT NULL,
43 like_value INTEGER,
44 dislike_value INTEGER,
45 datatime DATE
46 )''')
47
48 cursor.execute('''
49 CREATE TABLE IF NOT EXISTS autor_info (
50 id INTEGER PRIMARY KEY,
51 autor_id VARCHAR(100),
52 message_id INTEGER,
53 datatime DATE)''')
54
55 cursor.execute('''
56 CREATE TABLE IF NOT EXISTS user_chat_id (
57 id INTEGER PRIMARY KEY,
58 user_id INTEGER NOT NULL,
59 chat_id INTEGER)''')
60
61
62 @command
63 def add_autor_id(self, cursor, autor_id, message_id, data_time): # FIXME: Author, not autor
64 cursor.execute('INSERT INTO autor_info (autor_id, message_id, datatime) VALUES (?,?,?)',
65 (autor_id, message_id, data_time))
66
67
68 @command
69 def get_autor_id(self, cursor, message_id):
70 res = cursor.execute('SELECT autor_id FROM autor_info WHERE message_id=?', (message_id,)).fetchone()
71 return res
72
73
74 @command
75 def get_user_chat_id(self, cursor):
76 res = cursor.execute('SELECT chat_id FROM user_chat_id').fetchall()
77 return res
78
79
80 @command
81 def get_autor_id(self, cursor, message_id):
82 res = cursor.execute('SELECT autor_id FROM autor_info WHERE message_id=?', (message_id,)).fetchone()
83 return res
84
85
86 @command
87 def add_user_id_and_message_id(self, cursor, user_id, message_id, like, data_time):
88 if like:
89 cursor.execute(
90 'INSERT INTO user_like (user_id, message_id, like_value, dislike_value, datatime) VALUES (?,?,1,0,?)',
91 (user_id, message_id, data_time))
92 else:
93 cursor.execute(
94 'INSERT INTO user_like (user_id, message_id, like_value, dislike_value,datatime) VALUES (?,?,0,1,?)',
95 (user_id, message_id, data_time))
96 cursor.commit()
97
98
99 @command
100 def verify_user(self, cursor, user_id, message_id):
101 res = cursor.execute(
102 'SELECT user_id, message_id FROM user_like WHERE ((like_value=1 OR dislike_value=1) AND (user_id=? AND message_id=?))',
103 (user_id, message_id))
104 if res.fetchall() != []: return True
105 return False
106
107if __name__=='__main__':
108 vd = DbHelper('like.db')
109 print(vd.init_db())