Add File
This commit is contained in:
71
backend/apps/db/engine.py
Normal file
71
backend/apps/db/engine.py
Normal file
@@ -0,0 +1,71 @@
|
||||
# Author: Junjun
|
||||
# Date: 2025/5/19
|
||||
import urllib.parse
|
||||
from typing import List
|
||||
|
||||
from sqlalchemy import create_engine, text, MetaData, Table
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
from apps.datasource.models.datasource import DatasourceConf
|
||||
from common.core.config import settings
|
||||
|
||||
|
||||
def get_engine_config():
|
||||
return DatasourceConf(username=settings.POSTGRES_USER, password=settings.POSTGRES_PASSWORD,
|
||||
host=settings.POSTGRES_SERVER, port=settings.POSTGRES_PORT, database=settings.POSTGRES_DB,
|
||||
dbSchema="public", timeout=30) # read engine config
|
||||
|
||||
|
||||
def get_engine_uri(conf: DatasourceConf):
|
||||
return f"postgresql+psycopg2://{urllib.parse.quote(conf.username)}:{urllib.parse.quote(conf.password)}@{conf.host}:{conf.port}/{urllib.parse.quote(conf.database)}"
|
||||
|
||||
|
||||
def get_engine_conn():
|
||||
conf = get_engine_config()
|
||||
db_url = get_engine_uri(conf)
|
||||
engine = create_engine(db_url,
|
||||
connect_args={"options": f"-c search_path={conf.dbSchema}", "connect_timeout": conf.timeout},
|
||||
pool_timeout=conf.timeout)
|
||||
return engine
|
||||
|
||||
|
||||
def get_data_engine():
|
||||
engine = get_engine_conn()
|
||||
session_maker = sessionmaker(bind=engine)
|
||||
session = session_maker()
|
||||
return session
|
||||
|
||||
|
||||
def create_table(session, table_name: str, fields: List[any]):
|
||||
# field type relation
|
||||
list = []
|
||||
for f in fields:
|
||||
if "object" in f["type"]:
|
||||
f["relType"] = "text"
|
||||
elif "int" in f["type"]:
|
||||
f["relType"] = "bigint"
|
||||
elif "float" in f["type"]:
|
||||
f["relType"] = "numeric"
|
||||
elif "datetime" in f["type"]:
|
||||
f["relType"] = "timestamp"
|
||||
else:
|
||||
f["relType"] = "text"
|
||||
list.append(f'"{f["name"]}" {f["relType"]}')
|
||||
|
||||
sql = f"""
|
||||
CREATE TABLE "{table_name}" (
|
||||
{", ".join(list)}
|
||||
);
|
||||
"""
|
||||
session.execute(text(sql))
|
||||
session.commit()
|
||||
|
||||
|
||||
def insert_data(session, table_name: str, fields: List[any], data: List[any]):
|
||||
engine = get_engine_conn()
|
||||
metadata = MetaData()
|
||||
table = Table(table_name, metadata, autoload_with=engine)
|
||||
with engine.connect() as conn:
|
||||
stmt = table.insert().values(data)
|
||||
conn.execute(stmt)
|
||||
conn.commit()
|
||||
Reference in New Issue
Block a user