11from sqlalchemy import String , func , or_ , select , text
22from sqlalchemy .ext .asyncio import AsyncSession
33
4- from app .db .base import DATABASE_DIALECT
54from app .db .models import JWT , System
65from app .models .stats import Period
76
1918}
2019
2120
22- def _build_trunc_expression (period : Period , column ):
23- """Builds the appropriate truncation SQL expression based on DATABASE_DIALECT and period."""
24- if DATABASE_DIALECT == "postgresql" :
21+ def _build_trunc_expression (db : AsyncSession , period : Period , column ):
22+ dialect = db .bind .dialect .name
23+
24+ """Builds the appropriate truncation SQL expression based on dialect and period."""
25+ if dialect == "postgresql" :
2526 return func .date_trunc (period .value , column )
26- elif DATABASE_DIALECT == "mysql" :
27+ elif dialect == "mysql" :
2728 return func .date_format (column , MYSQL_FORMATS [period .value ])
28- elif DATABASE_DIALECT == "sqlite" :
29+ elif dialect == "sqlite" :
2930 return func .strftime (SQLITE_FORMATS [period .value ], column )
3031
31- raise ValueError (f"Unsupported dialect: { DATABASE_DIALECT } " )
32+ raise ValueError (f"Unsupported dialect: { dialect } " )
3233
3334
34- def get_datetime_add_expression (datetime_column , seconds : int ):
35+ def get_datetime_add_expression (db : AsyncSession , datetime_column , seconds : int ):
3536 """
3637 Get database-specific datetime addition expression
3738 """
38- if DATABASE_DIALECT == "mysql" :
39+ dialect = db .bind .dialect .name
40+ if dialect == "mysql" :
3941 return func .date_add (datetime_column , text ("INTERVAL :seconds SECOND" ).bindparams (seconds = seconds ))
40- elif DATABASE_DIALECT == "postgresql" :
42+ elif dialect == "postgresql" :
4143 return datetime_column + func .make_interval (0 , 0 , 0 , 0 , 0 , 0 , seconds )
42- elif DATABASE_DIALECT == "sqlite" :
44+ elif dialect == "sqlite" :
4345 return func .datetime (func .strftime ("%s" , datetime_column ) + seconds , "unixepoch" )
4446
45- raise ValueError (f"Unsupported dialect: { DATABASE_DIALECT } " )
47+ raise ValueError (f"Unsupported dialect: { dialect } " )
4648
4749
48- def json_extract (column , path : str ):
50+ def json_extract (db : AsyncSession , column , path : str ):
4951 """
5052 Args:
5153 column: The JSON column in your model
5254 path: JSON path (e.g., '$.theme')
5355 """
54- match DATABASE_DIALECT :
56+ dialect = db .bind .dialect .name
57+ match dialect :
5558 case "postgresql" :
5659 keys = path .replace ("$." , "" ).split ("." )
5760 expr = column
@@ -64,14 +67,14 @@ def json_extract(column, path: str):
6467 return func .json_extract (column , path ).cast (String )
6568
6669
67- def build_json_proxy_settings_search_condition (column , value : str ):
70+ def build_json_proxy_settings_search_condition (db : AsyncSession , column , value : str ):
6871 """
6972 Builds a condition to search JSON column for UUIDs or passwords.
7073 Supports PostgresSQL, MySQL, SQLite.
7174 """
7275 return or_ (
7376 * [
74- json_extract (column , field ) == value
77+ json_extract (db , column , field ) == value
7578 for field in ("$.vmess.id" , "$.vless.id" , "$.trojan.password" , "$.shadowsocks.password" )
7679 ],
7780 )
0 commit comments