简体   繁体   English

sqlalchemy 多条语句多参数传递

[英]sqlalchemy multiple statements with multiple parameters to pass

I've created a valid connection through sqlalchemy when I didn't pass variables into my tape_query string, which is a multi-statement query.当我没有将变量传递到我的 tape_query 字符串中时,我已经通过 sqlalchemy 创建了一个有效的连接,这是一个多语句查询。 However, when I tried to pass sp_input through:sp into the string per below, I get a KeyError: 'data_date' error per below.但是,当我尝试将 sp_input through:sp 传递到下面的字符串中时,我得到下面的 KeyError: 'data_date' 错误。 What am I missing?我错过了什么?

what works:什么有效:

"""
USE DATABASE this;
USE SCHEMA that;
SELECT * from table where id=100;
"""

conn = engine.connect()
for q in tape_query.split(";"):
    conn.execute(q)

what doesn't work:什么不起作用:

tape_query=
"""
USE DATABASE this;
USE SCHEMA that;
SELECT * from table where id=:sp;
"""

sp_input=200

conn = engine.connect()
for q in tape_query.split(";"):
    conn.execute(q, {"sp":sp_input})

the error looks like this:错误如下所示:

~\anaconda3\lib\site-packages\snowflake\connector\cursor.py in execute(self, command, params, timeout, >_exec_async, _do_reset, _put_callback, _put_azure_callback, _put_callback_output_stream, _get_callback, >_get_azure_callback, _get_callback_output_stream, _show_progress_bar, _statement_params, _is_internal, >_no_results, _use_ijson, _is_put_get, _raise_put_get_error, _force_put_overwrite) 509 params, processed_params) 510 if len(processed_params) > 0: --> 511 query = command % processed_params 512 else: 513 query = command ~\anaconda3\lib\site-packages\snowflake\connector\cursor.py 在执行(自我,命令,参数,超时,>_exec_async,_do_reset,_put_callback,_put_azure_callback,_put_callback_output_stream,_get_callback,>_get_azure_callback,_get_callback_output_stream,_show_progress_bar,_statement_params, _is_internal, >_no_results, _use_ijson, _is_put_get, _raise_put_get_error, _force_put_overwrite) 509 参数, 处理参数) 510 如果 len(processed_params) > 0: --> 511 查询 = 命令 % 处理参数 512 否则: 513 查询 = 命令

KeyError: 'data_date' KeyError:'data_date'

Perhaps you could try something like this?也许你可以尝试这样的事情? If not, then maybe dig into the documentation.如果没有,那么可能会深入研究文档。

https://docs.sqlalchemy.org/en/13/core/engines.html https://docs.sqlalchemy.org/en/13/core/engines.html

https://docs.sqlalchemy.org/en/13/core/connections.html https://docs.sqlalchemy.org/en/13/core/connections.html

from sqlalchemy import create_engine

engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')

sp_input = [100, 200]
query_string = f"select * from table1 where id={sp_input[0]}; select * from table2 where id={sp_input[1]}"

connection = engine.raw_connection()
try:
    cursor = connection.cursor()
    cursor.execute(query_string)
    results_one = cursor.fetchall()
    cursor.nextset()
    results_two = cursor.fetchall()
    cursor.close()
finally:
    connection.close()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM