53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
"""连接与读写 IO。PG 用 psycopg(3),MySQL 用 pymysql。桥不 import 基座/平台代码。"""
|
||
from contextlib import contextmanager
|
||
|
||
import pandas as pd
|
||
import psycopg
|
||
import pymysql
|
||
|
||
import config
|
||
|
||
|
||
@contextmanager
|
||
def akg_pg_conn():
|
||
c = config.akg_pg()
|
||
conn = psycopg.connect(host=c.host, port=c.port, user=c.user,
|
||
password=c.password, dbname=c.db)
|
||
try:
|
||
yield conn
|
||
finally:
|
||
conn.close()
|
||
|
||
|
||
def _mysql(c: "config.Conn"):
|
||
return pymysql.connect(host=c.host, port=c.port, user=c.user, password=c.password,
|
||
database=c.db, charset="utf8mb4", read_timeout=180)
|
||
|
||
|
||
@contextmanager
|
||
def _mysql_cm(which: str):
|
||
c = {"heat": config.heat_mysql, "factor": config.factor_mysql,
|
||
"price": config.price_mysql}[which]()
|
||
conn = _mysql(c)
|
||
try:
|
||
yield conn
|
||
finally:
|
||
conn.close()
|
||
|
||
|
||
def read_pg(sql: str, params=None) -> pd.DataFrame:
|
||
with akg_pg_conn() as conn:
|
||
return pd.read_sql(sql, conn, params=params)
|
||
|
||
|
||
def read_mysql(which: str, sql: str, params=None) -> pd.DataFrame:
|
||
with _mysql_cm(which) as conn:
|
||
return pd.read_sql(sql, conn, params=params)
|
||
|
||
|
||
@contextmanager
|
||
def factor_conn():
|
||
"""写因子库用(需要游标提交)。"""
|
||
with _mysql_cm("factor") as conn:
|
||
yield conn
|