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)
我不确定我是否理解为什么 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)