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'
,其中key
是params
中的一个键)是否作为子字符串出现在statement
中。如果是,那么当前的键值对(key: value
)将被包含在最终的needed_params
字典中。-
f':{key}'
的作用- 动态替换:
f':{key}'
利用f-string的特性,将{key}
部分动态地替换为当前迭代的键(key
)的值,但在这个特定的上下文中,由于实际上只是用它来构建一个字符串用于检查(而不是用于格式化输出),所以这里的值(即键本身)并没有被直接用于替换,而是与冒号(:
)一起构成了一个新的字符串,用于后续的检查。 - 条件筛选:通过与
if
语句结合使用,f':{key}'
允许根据statement
字符串中是否包含特定模式的键(即':key'
),来决定是否将原字典params
中的某个键值对包含在新字典needed_params
中。这实际上是一种基于字符串内容的过滤机制。
- 动态替换: