(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=False)
| 583 | |
| 584 | |
| 585 | def 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 | ] |
no test coverage detected