-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcreate_database.py
More file actions
174 lines (150 loc) · 5.67 KB
/
Copy pathcreate_database.py
File metadata and controls
174 lines (150 loc) · 5.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
import asyncio
import logging
import os
import time
logger = logging.getLogger(__name__)
try:
from data.database import execute_query
except ImportError:
print('Ошибка: Не удалось импортировать "execute_query".')
print('Убедитесь, что вы запускаете скрипт из корневой папки проекта "YandexMusicBot".')
exit(1)
# --- Основные таблицы ---
SQL_CREATE_USERS_TABLE = '''
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY,
balance REAL DEFAULT (0)
NOT NULL,
lang TEXT NOT NULL
DEFAULT ru,
ts_registration INTEGER NOT NULL,
ts_premium_until INTEGER,
premium_notified INTEGER NOT NULL DEFAULT (0),
action_count INTEGER NOT NULL
DEFAULT (0),
referrer_id INTEGER REFERENCES users (user_id) ON DELETE SET NULL
ON UPDATE CASCADE,
daily_usage_count INTEGER NOT NULL DEFAULT (0),
recognize_search_count INTEGER NOT NULL DEFAULT (0),
last_usage_ts INTEGER NOT NULL DEFAULT (0)
);
'''
SQL_CREATE_PAYMENTS_TABLE = '''
CREATE TABLE IF NOT EXISTS payments (
payment_id INTEGER PRIMARY KEY,
user_id INTEGER REFERENCES users (user_id) ON DELETE SET NULL
ON UPDATE CASCADE
NOT NULL,
amount REAL NOT NULL
DEFAULT (0),
days INTEGER NOT NULL
DEFAULT (1),
screenshot_path TEXT,
status INTEGER NOT NULL
DEFAULT (0),
created_ts INTEGER NOT NULL,
processed_ts INTEGER
);
'''
SQL_CREATE_TRACKS_TABLE = '''
CREATE TABLE IF NOT EXISTS tracks (
track_id INTEGER PRIMARY KEY,
source_id TEXT NOT NULL,
source_type TEXT NOT NULL
DEFAULT youtube,
title TEXT NOT NULL,
artist TEXT,
duration INTEGER NOT NULL,
UNIQUE (
source_id,
source_type
)
ON CONFLICT IGNORE
);
'''
SQL_CREATE_PLAY_HISTORY_TABLE = '''
CREATE TABLE IF NOT EXISTS play_history (
history_id INTEGER PRIMARY KEY,
user_id INTEGER REFERENCES users (user_id) ON DELETE CASCADE
ON UPDATE CASCADE
NOT NULL,
track_id INTEGER NOT NULL
REFERENCES tracks (track_id) ON DELETE CASCADE
ON UPDATE CASCADE,
played_ts INTEGER NOT NULL
);
'''
SQL_CREATE_FAVORITES_TABLE = '''
CREATE TABLE IF NOT EXISTS favorites (
user_id INTEGER REFERENCES users (user_id) ON DELETE CASCADE
ON UPDATE CASCADE,
track_id INTEGER REFERENCES tracks (track_id) ON DELETE CASCADE
ON UPDATE CASCADE,
added_ts INTEGER NOT NULL,
PRIMARY KEY (
user_id,
track_id
)
ON CONFLICT IGNORE
);
'''
SQL_CREATE_BOT_STATUS_TABLE = '''
CREATE TABLE IF NOT EXISTS bot_status (
status_id INTEGER PRIMARY KEY,
status INTEGER NOT NULL
DEFAULT (1),
updated_ts INTEGER NOT NULL
);
'''
SQL_CREATE_ADS_TABLE = '''
CREATE TABLE IF NOT EXISTS ads (
ads_id INTEGER PRIMARY KEY AUTOINCREMENT,
content_path TEXT,
caption TEXT NOT NULL
);
'''
# --- Индексы ---
SQL_CREATE_INDEXES = [
"CREATE INDEX IF NOT EXISTS idx_users_referrer_id ON users (referrer_id);",
"CREATE INDEX IF NOT EXISTS idx_users_ts_premium_until ON users (ts_premium_until);",
"CREATE INDEX IF NOT EXISTS idx_payments_user_id ON payments (user_id);",
"CREATE INDEX IF NOT EXISTS idx_payments_status ON payments (status);",
"CREATE INDEX IF NOT EXISTS idx_play_history_user_id_played_ts ON play_history (user_id, played_ts DESC);",
"CREATE INDEX IF NOT EXISTS idx_play_history_track_id ON play_history (track_id);",
"CREATE INDEX IF NOT EXISTS idx_favorites_user_id_added_ts ON favorites (user_id, added_ts DESC);"
]
async def setup_database():
"""
Выполняет полную настройку базы данных.
Используется режим транзакций.
"""
logger.info('[*] Настройка базы данных...')
db_folder = 'data/database'
if not os.path.exists(db_folder):
os.makedirs(db_folder)
logger.info(f'[+] Папка "{db_folder}" создана.')
all_queries = [
(SQL_CREATE_USERS_TABLE, ()),
(SQL_CREATE_PAYMENTS_TABLE, ()),
(SQL_CREATE_TRACKS_TABLE, ()),
(SQL_CREATE_PLAY_HISTORY_TABLE, ()),
(SQL_CREATE_FAVORITES_TABLE, ()),
(SQL_CREATE_BOT_STATUS_TABLE, ()),
(SQL_CREATE_ADS_TABLE, ()),
]
for index_query in SQL_CREATE_INDEXES:
all_queries.append((index_query, ()))
success = await execute_query(all_queries)
if success:
logger.info('[+] База данных успешно собрана и настроена!')
await execute_query(
'''
INSERT OR IGNORE INTO bot_status (status_id, status, updated_ts)
VALUES (?, ?, ?)
''', (1, 1, int(time.time()))
)
logger.info('[+] Начальный статус бота был установлен на 1 (активен).')
else:
logger.info('[!] Произошла нежданная ошибка при настройке базы данных!')
if __name__ == '__main__':
asyncio.run(setup_database())