【问题标题】:Python SQL: Error reading and executing SQL filePython SQL:读取和执行 SQL 文件时出错
【发布时间】: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


【解决方案1】:

(我在 SQL Server Management Studio 中将其保存为编码的 UTF-8 代码页 65001)

SSMS“高级保存选项”对话框中“编码”列表顶部附近的 UTF-8 选项是“带签名的 UTF-8”

该选项将在文件开头写入 Unicode BOM(字节顺序标记),编码为 \xEF\xBB\xBF

如果我们使用标准的“utf-8”编码在 Python 中读取文件,我们会得到字符串中包含的 Unicode BOM 字符 \ufeff

with open(r"C:\Users\Gord\Desktop\SQLQuery1.sql", encoding="utf-8") as f:
    s = f.read()
print(repr(s))  # '\ufeffSET NOCOUNT ON;'

但是,如果我们使用 Python 的“utf-8-sig”编码读取文件,那么我们会得到删除了 BOM 字符的字符串

with open(r"C:\Users\Gord\Desktop\SQLQuery1.sql", encoding="utf-8-sig") as f:
    s = f.read()
print(repr(s))  # 'SET NOCOUNT ON;'

【讨论】:

  • 太棒了!我认为签名部分让我失望。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 2016-08-25
  • 2013-04-09
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 2018-02-28
  • 1970-01-01
相关资源
最近更新 更多