【发布时间】:2020-06-24 00:35:01
【问题描述】:
我正在尝试使用 sqlalchemy 在 Python 中红色并执行一个 SQL 文件。应该很简单吧?
conn=sqlalchemy.create_engine('mssql+pyodbc://' + DSN).connect()
query = open('../toy_example.sql',encoding="utf-8").read()
trans = conn.begin()
conn.execute(query)
trans.commit()
我收到此错误
ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Incorrect syntax near '\ufeff'. (102) (SQLExecDirectW)")
[SQL: drop table temp;
With t0 as (select 1+1)
select * into temp from t0]
为什么会出现此错误?我不确定这是文件编码错误还是 SQLAlchemy 错误。理想情况下,这应该很简单。
编辑:
此代码工作正常,假设表 temp 存在:
conn=sqlalchemy.create_engine('mssql+pyodbc://' + DSN).connect()
query = "drop table temp; With t0 as (select 1+1 t) select * into temp from t0"
trans = conn.begin()
conn.execute(query)
trans.commit()
编辑 2:
作为参考,这里是 toy_example.sql 文件的链接。
http://s000.tinyupload.com/index.php?file_id=62746453331292257227
【问题讨论】:
-
SQL 文件中有多个查询,SQLAlchemy 不支持这样执行它们。请参阅副本以了解解决方法。
-
@Barmar。首先,这不是真的。 SQLAlchemy 似乎确实支持为我执行多个语句。查看我的编辑
-
@Barmar 其次,我的问题不是关于执行多个 sql 语句,所以它不应该被标记为重复
-
我假设一个 .sql 文件将包含多个语句。但是现在我查看了错误消息,看起来问题出在 Unicode 转义序列
'\ufeff' -
@Barmar 没问题,感谢您重新提出问题。我以前见过那个特定的问题,根据你链接的问题,也许它可能取决于数据库的类型。为了安全起见,我会用数据库类型标记我的问题。
标签: python sql sql-server sqlalchemy pyodbc