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