MCPcopy Index your code
hub / github.com/dataease/SQLBot / exec_sql

Function exec_sql

backend/apps/db/db.py:585–716  ·  view source on GitHub ↗
(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=False)

Source from the content-addressed store, hash-verified

583
584
585def exec_sql(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=False):
586 while sql.endswith(';'):
587 sql = sql[:-1]
588 # check execute sql only contain read operations
589 if not check_sql_read(sql, ds):
590 raise ValueError(f"SQL can only contain read operations")
591
592 db = DB.get_db(ds.type)
593 if db.connect_type == ConnectType.sqlalchemy:
594 with get_session(ds) as session:
595 with session.execute(text(sql)) as result:
596 try:
597 columns = result.keys()._keys if origin_column else [item.lower() for item in result.keys()._keys]
598 res = result.fetchall()
599 result_list = [
600 {str(columns[i]): convert_value(value) for i, value in enumerate(tuple_item)} for tuple_item in
601 res
602 ]
603 return {"fields": columns, "data": result_list,
604 "sql": bytes.decode(base64.b64encode(bytes(sql, 'utf-8')))}
605 except Exception as ex:
606 raise ParseSQLResultError(str(ex))
607 else:
608 conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration)))
609 extra_config_dict = get_extra_config(conf)
610 if equals_ignore_case(ds.type, 'dm'):
611 with dmPython.connect(user=conf.username, password=conf.password, server=conf.host,
612 port=conf.port, **extra_config_dict) as conn, conn.cursor() as cursor:
613 try:
614 cursor.execute(sql, timeout=conf.timeout)
615 res = cursor.fetchall()
616 columns = [field[0] for field in cursor.description] if origin_column else [field[0].lower() for
617 field in
618 cursor.description]
619 result_list = [
620 {str(columns[i]): convert_value(value) for i, value in enumerate(tuple_item)} for tuple_item in
621 res
622 ]
623 return {"fields": columns, "data": result_list,
624 "sql": bytes.decode(base64.b64encode(bytes(sql, 'utf-8')))}
625 except Exception as ex:
626 raise ParseSQLResultError(str(ex))
627 elif equals_ignore_case(ds.type, 'doris', 'starrocks'):
628 ssl_args = {'ssl': {'ssl_mode': 'REQUIRE'}} if conf.ssl else {}
629 with pymysql.connect(user=conf.username, passwd=conf.password, host=conf.host,
630 port=conf.port, db=conf.database, connect_timeout=conf.timeout,
631 read_timeout=conf.timeout, **extra_config_dict,
632 **ssl_args) as conn, conn.cursor() as cursor:
633 try:
634 cursor.execute(sql)
635 res = cursor.fetchall()
636 columns = [field[0] for field in cursor.description] if origin_column else [field[0].lower() for
637 field in
638 cursor.description]
639 result_list = [
640 {str(columns[i]): convert_value(value) for i, value in enumerate(tuple_item)} for tuple_item in
641 res
642 ]

Callers 6

execSqlFunction · 0.90
previewFunction · 0.90
fieldEnumFunction · 0.90
get_table_sample_dataFunction · 0.90
execute_sqlMethod · 0.90
get_chart_data_dsFunction · 0.90

Calls 13

ParseSQLResultErrorClass · 0.90
DatasourceConfClass · 0.90
aes_decryptFunction · 0.90
equals_ignore_caseFunction · 0.90
get_es_data_by_httpFunction · 0.90
check_sql_readFunction · 0.85
convert_valueFunction · 0.85
bytesFunction · 0.85
get_extra_configFunction · 0.85
get_dbMethod · 0.80
get_sessionFunction · 0.70
getMethod · 0.65

Tested by

no test coverage detected