无法将 delete 语句中的参数从 sqlalchemy execute 传递到 SQL 服务器
failing to pass parameters in delete statement to SQL server from sqlalchemy execute
我正在使用 SQL 服务器 v12.0.2000.8 并尝试从 sqlalchemy (v1.4.5) msserver+pyodbc 连接发出 SQL 中的删除语句。受到 sqlalchemy 文档 here and here and Whosebug post 的启发,我尝试了很多东西。仍然没有成功。我的下一步将使用 sqlalchemy table 方法,但我想了解我做错了什么,因为我已经以类似的方式插入了下面的 A 并且它们起作用了。直接替换字符串中的值是可行的,但显然不行。
- 一个
deleted_records = ('some_pk_val',)
with mssql_pyodbc_engine.begin() as connection:
for query_accs in slicer(deleted_records, chunk_size=1000):
delete_statement1 = text(f"""
DELETE FROM schema.table1
WHERE pk_col IN ({', '.join(['?'] * len(deleted_records))});
""")
connection.execute(delete_statement1, *deleted_records)
delete_statement2 = text(f"""
DELETE FROM schema.table2
WHERE pk_col IN ({', '.join(['?'] * len(deleted_records))});
""")
connection.execute(delete_statement2, *deleted_records)
DBAPIError: (pyodbc.Error) ('07002', '[07002] [Microsoft][ODBC Driver 17 for SQL Server]COUNT field incorrect or syntax error (0) (SQLExecDirectW)')
[SQL:
DELETE FROM schema.table1
WHERE pk_col IN (?);
]
(Background on this error at: http://sqlalche.me/e/14/dbapi)
- B
deleted_records = ('some_pk_val',)
with mssql_pyodbc_engine.begin() as connection:
for query_accs in slicer(deleted_records, chunk_size=1000):
delete_statement1 = text(f"""
DELETE FROM schema.table1
WHERE pk_col IN :delrecs;
""")
connection.execute(delete_statement1, {'delrecs': deleted_records})
delete_statement2 = text(f"""
DELETE FROM schema.table2
WHERE pk_col IN :delrecs;
""")
connection.execute(delete_statement2, {'delrecs': deleted_records})
ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near '@P1'. (102) (SQLExecDirectW)")
[SQL:
DELETE FROM schema.table1
WHERE pk_col IN ?;
]
[parameters: (('some_pk_val',),)]
(Background on this error at: http://sqlalche.me/e/14/f405)
- C
from sqlalchemy import bindparam
deleted_records = ('some_pk_val',)
with mssql_pyodbc_engine.begin() as connection:
for query_accs in slicer(deleted_records, chunk_size=1000):
delete_statement1 = text(f"""
DELETE FROM schema.table1
WHERE pk_col IN :delrecs;
""")
delete_statement1 = delete_statement1.bindparams(bindparam('delrecs', expanding=True))
connection.execute(delete_statement1, {'delrecs': deleted_records})
delete_statement2 = text(f"""
DELETE FROM schema.table2
WHERE pk_col IN :delrecs;
""")
delete_statement2 = delete_statement2.bindparams(bindparam('delrecs', expanding=True))
connection.execute(delete_statement2, {'delrecs': deleted_records})
挂起
提前致谢
我已经解决了我自己的问题。任何卡在旧 SQL 服务器版本的更新。调用 sqlalchemy 删除函数也不起作用,但 executemany 起作用了:
deleted_records = ('some_pk_val',)
with mssql_pyodbc_engine.begin() as connection:
cur = connection.connection.cursor()
cur.fast_executemany = True
delete_stmt = """
DELETE FROM schema.table1
WHERE pk_col = ?;
"""
cur.executemany(delete_stmt, [[acc] for acc in deleted_records])
cur.close()
我正在使用 SQL 服务器 v12.0.2000.8 并尝试从 sqlalchemy (v1.4.5) msserver+pyodbc 连接发出 SQL 中的删除语句。受到 sqlalchemy 文档 here and here and Whosebug post 的启发,我尝试了很多东西。仍然没有成功。我的下一步将使用 sqlalchemy table 方法,但我想了解我做错了什么,因为我已经以类似的方式插入了下面的 A 并且它们起作用了。直接替换字符串中的值是可行的,但显然不行。
- 一个
deleted_records = ('some_pk_val',)
with mssql_pyodbc_engine.begin() as connection:
for query_accs in slicer(deleted_records, chunk_size=1000):
delete_statement1 = text(f"""
DELETE FROM schema.table1
WHERE pk_col IN ({', '.join(['?'] * len(deleted_records))});
""")
connection.execute(delete_statement1, *deleted_records)
delete_statement2 = text(f"""
DELETE FROM schema.table2
WHERE pk_col IN ({', '.join(['?'] * len(deleted_records))});
""")
connection.execute(delete_statement2, *deleted_records)
DBAPIError: (pyodbc.Error) ('07002', '[07002] [Microsoft][ODBC Driver 17 for SQL Server]COUNT field incorrect or syntax error (0) (SQLExecDirectW)')
[SQL:
DELETE FROM schema.table1
WHERE pk_col IN (?);
]
(Background on this error at: http://sqlalche.me/e/14/dbapi)
- B
deleted_records = ('some_pk_val',)
with mssql_pyodbc_engine.begin() as connection:
for query_accs in slicer(deleted_records, chunk_size=1000):
delete_statement1 = text(f"""
DELETE FROM schema.table1
WHERE pk_col IN :delrecs;
""")
connection.execute(delete_statement1, {'delrecs': deleted_records})
delete_statement2 = text(f"""
DELETE FROM schema.table2
WHERE pk_col IN :delrecs;
""")
connection.execute(delete_statement2, {'delrecs': deleted_records})
ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near '@P1'. (102) (SQLExecDirectW)")
[SQL:
DELETE FROM schema.table1
WHERE pk_col IN ?;
]
[parameters: (('some_pk_val',),)]
(Background on this error at: http://sqlalche.me/e/14/f405)
- C
from sqlalchemy import bindparam
deleted_records = ('some_pk_val',)
with mssql_pyodbc_engine.begin() as connection:
for query_accs in slicer(deleted_records, chunk_size=1000):
delete_statement1 = text(f"""
DELETE FROM schema.table1
WHERE pk_col IN :delrecs;
""")
delete_statement1 = delete_statement1.bindparams(bindparam('delrecs', expanding=True))
connection.execute(delete_statement1, {'delrecs': deleted_records})
delete_statement2 = text(f"""
DELETE FROM schema.table2
WHERE pk_col IN :delrecs;
""")
delete_statement2 = delete_statement2.bindparams(bindparam('delrecs', expanding=True))
connection.execute(delete_statement2, {'delrecs': deleted_records})
挂起
提前致谢
我已经解决了我自己的问题。任何卡在旧 SQL 服务器版本的更新。调用 sqlalchemy 删除函数也不起作用,但 executemany 起作用了:
deleted_records = ('some_pk_val',)
with mssql_pyodbc_engine.begin() as connection:
cur = connection.connection.cursor()
cur.fast_executemany = True
delete_stmt = """
DELETE FROM schema.table1
WHERE pk_col = ?;
"""
cur.executemany(delete_stmt, [[acc] for acc in deleted_records])
cur.close()