SQL 对比 sqlalchemy.execute

SQL vs sqlalchemy.execute

我不确定我是否理解为什么 SQL 代码在使用 python 库 "sqlalchemy" 发送时与直接在数据库上执行时的行为不同。

正在建立与 MS 的连接SQL

import sqlalchemy, pyodbc

# Establishing connection
connection_string = 'DRIVER={ODBC Driver 17 for SQL Server};Server=' + host + ';Database=' + database + ';UID=' + user + '@' + server_name + ';PWD=' + password + ';Port=' + str(port) + ';'
quoted = urllib.parse.quote_plus(connection_string)
db_engine = sqlalchemy.create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))

预期行为示例

# SQL executed in database
CREATE TABLE my_table (col1 float(53), col2 varchar(100), col3 varchar(10))

# SQL executed using sqlalchemy engine
db_engine.execute("CREATE TABLE my_table (col1 float(53), col2 varchar(100), col3 varchar(10))")

两个示例都按预期创建了 table,但是当我想要 运行 更复杂的查询时,使用 sqlalchemy 时事情开始出错!

意外行为

# SQL executed in database
IF NOT EXISTS (select * from information_schema.tables where table_name='my_table') CREATE TABLE my_table (col1 float(53), col2 varchar(100), col3 varchar(10))

# SQL executed using sqlalchemy engine
db_engine.execute("IF NOT EXISTS (select * from information_schema.tables where table_name='my_table') CREATE TABLE my_table (col1 float(53), col2 varchar(100), col3 varchar(10))")

如果 table 不存在,则应该创建 table。这在 SQL 查询直接在数据库中执行时有效,但使用 sqlalchemy 没有任何反应,我什至没有收到错误消息。我不明白为什么????

我已经通过打开自动提交解决了这个问题。我不确定为什么这个令人费解的事情会起作用,但它确实有效。

修复意外行为

import sqlalchemy
import text from sqlalchemy

# Creating text query with autocommit on
my_query = text("IF NOT EXISTS (select * from information_schema.tables where table_name='my_table') CREATE TABLE my_table (col1 float(53), col2 varchar(100), col3 varchar(10))").execution_options(autocommit=True)

# Executing query
db_engine.engine.execute(my_query)