SQLAlchemy实现多条SQL语句参数化查询同时返回结果

SQLAlchemy实现多条SQL语句参数化查询 ,每条SQL所使用的参数不一定相同,每条查询的结果以字典列表形式返回,多条语句的查询结果合并以列表形式返回。

代码实现如下:

def connect_mysql(username, password, host, port, database, params, statements):
    connection_string = f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}'
    engine = create_engine(connection_string)
    with engine.connect() as connection:
        list_query_results = []
        for statement in statements:
            # 创建一个新的字典,只包含当前 SQL 语句需要的参数
            needed_params = {key: value for key, value in params.items() if f':{key}' in statement}
            # 使用text()函数来构造SQL表达式,并传入参数
            stmt = text(statement).bindparams(**needed_params)
            result_proxy = connection.execute(stmt)
            # 初始化一个空列表来存储结果字典
            result_dicts = []
            # 获取列名
            column_names = result_proxy.keys()
            # 遍历结果集中的每一行
            for row_proxy in result_proxy:
                # 创建一个字典来存储这一行的数据
                row_dict = {name: row_proxy._mapping[name] for name in column_names}
                # 将这一行的数据字典添加到结果列表中
                result_dicts.append(row_dict)# 将结果列表添加到总的结果列表中
            list_query_results.append(result_dicts)
            # list_query_results.append(list_query_results.fetchall())
    print("Query executed successfully")
    print(list_query_results)
    return list_query_results
  • if f':{key}' in statement: 这是一个条件表达式,用于检查替换后的字符串(即':key',其中keyparams中的一个键)是否作为子字符串出现在statement中。如果是,那么当前的键值对(key: value)将被包含在最终的needed_params字典中。
  • f':{key}' 的作用

    • 动态替换:f':{key}'利用f-string的特性,将{key}部分动态地替换为当前迭代的键(key)的值,但在这个特定的上下文中,由于实际上只是用它来构建一个字符串用于检查(而不是用于格式化输出),所以这里的值(即键本身)并没有被直接用于替换,而是与冒号(:)一起构成了一个新的字符串,用于后续的检查。
    • 条件筛选:通过与if语句结合使用,f':{key}'允许根据statement字符串中是否包含特定模式的键(即':key'),来决定是否将原字典params中的某个键值对包含在新字典needed_params中。这实际上是一种基于字符串内容的过滤机制。
posted @ 2024-07-09 18:20  钟吾零ZWL  阅读(24)  评论(0编辑  收藏  举报