-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdb.py
More file actions
50 lines (45 loc) · 1.58 KB
/
Copy pathdb.py
File metadata and controls
50 lines (45 loc) · 1.58 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
from dotenv import load_dotenv
load_dotenv()
from sqlalchemy import create_engine, text
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy.orm import sessionmaker
import os
FAST_DB_HOST = os.getenv("FAST_DB_HOST")
FAST_DB_USER = os.getenv("FAST_DB_USER")
FAST_DB_PASS = os.getenv("FAST_DB_PASS")
FAST_DB_PORT = os.getenv("FAST_DB_PORT")
FAST_DB_NAME = os.getenv("FAST_DB_NAME")
DATABASE_URL = (f"mysql+asyncmy://{FAST_DB_USER}:{FAST_DB_PASS}@{FAST_DB_HOST}:{FAST_DB_PORT}/{FAST_DB_NAME}")
engine = create_async_engine(DATABASE_URL, pool_size=10, max_overflow=20, echo=False)
async def fetch_random_keywords(limit: int) -> list[dict]:
"""
keyword 테이블에서 `limit` 개를 중복 없이 무작위로 뽑아
Socket.IO 로직에서 바로 쓸 수 있는 딕셔너리 형태로 반환한다.
"""
sql = text(
"""
SELECT keyword_type, keyword_name, keyword_alias
FROM keyword
ORDER BY RAND()
LIMIT :limit
"""
)
async with engine.connect() as conn:
result = await conn.execute(sql, {"limit": limit})
rows = result.mappings().all()
keywords = []
for row in rows:
# '레드벨벳|redvelvet' → ['레드벨벳', 'redvelvet']
alias_list = (
[a.strip() for a in row["keyword_alias"].split("|")]
if row["keyword_alias"]
else []
)
keywords.append(
{
"type": row["keyword_type"],
"name": row["keyword_name"],
"alias": alias_list,
}
)
return keywords