· 5 years ago · May 02, 2020, 09:46 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):
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 @_command
66 def add_autor_id(self, cursor, autor_id, message_id, data_time): # FIXME: Author, not autor
67 cursor.execute('INSERT INTO autor_info (autor_id, message_id, datatime) VALUES (?,?,?)',
68 (autor_id, message_id, data_time))
69
70
71 @_command
72 def get_autor_id(self, cursor, message_id):
73 res = cursor.execute('SELECT autor_id FROM autor_info WHERE message_id=?', (message_id,)).fetchone()
74 return res
75
76
77 @_command
78 def get_user_chat_id(self, cursor):
79 res = cursor.execute('SELECT chat_id FROM user_chat_id').fetchall()
80 return res