python - sqlalchemy 寻找字符串形式的服务器版本,而不是类似字节的对象

标签 python windows sqlalchemy pypyodbc

我不知道是什么突然导致了这种情况(我最近重新安装了 Anaconda 和所有 python 库,但我又回到了之前的版本),但是当 sqlalchemy 尝试连接到 SQL 服务器时,它失败了,因为它查找服务器版本并尝试对其运行字符串操作。

在我重新安装软件包之前,以下内容没有任何问题。我会像这样连接:

sqlalchemy_conn_string = 'mssql+pyodbc://myDSN'
sqlalchemy.create_engine(sqlalchemy_conn_string, module=pypyodbc)

然后它一直到达一个名为 pyodbc.py 的文件,并在此函数处失败:

def _get_server_version_info(self, connection):
  try:
    raw = connection.scalar("SELECT SERVERPROPERTY('ProductVersion')")
  except exc.DBAPIError:
    #...
  else:
    version= []
    r = re.compile(r'[.\-]')
    for n in r.split(raw):  # culprit here
      try:
        version.append(int(n))
      except ValueError:
        version.append(n)
    return tuple(version)

Out[1]: TypeError: cannot use a string pattern on a bytes-like object

那是因为在这一步,raw不是一个可以分割的字符串:

# from PyCharm's debugger window
raw = {bytes}b'13.0.5026.0'

此时,我不知道是否应该提交 sqlalchemy 和/或 pypyodbc 的错误报告,或者我是否可以自己修复此问题。但我想要一个不涉及在我自己的机器上编辑 sqlalchemy 代码的解决方案(例如专门处理类似字节的对象),因为我们还有其他团队成员也将下载普通 sqlalchemy 和 pypyodbc 并且不会'没有信心编辑该源代码。

最佳答案

我已经确认了 Python 3.6.4 下的 pypyodbc 行为。

print(pypyodbc.version)  # 1.3.5
sql = """\
SELECT SERVERPROPERTY('ProductVersion')
"""
crsr.execute(sql)
x = crsr.fetchone()[0]
print(repr(x))  # b'12.0.5207.0'

请注意,SQLAlchemy 的 mssql+pyodbc 方言是为 pyodbc 编码的,而不是 pypyodbc,并且不保证两者 100% 兼容。

显而易见的解决方案是使用 pyodbc 代替。

更新:

检查您的 SQLAlchemy 版本。我刚刚查看了mssql+pyodbc dialect的当前源代码确实如此

def _get_server_version_info(self, connection):
    try:
        # "Version of the instance of SQL Server, in the form
        # of 'major.minor.build.revision'"
        raw = connection.scalar(
            "SELECT CAST(SERVERPROPERTY('ProductVersion') AS VARCHAR)")

即使使用 pypyodbc,也应该避免该问题。

如果您使用的是 SQLAlchemy 的最新生产版本(当前版本为 1.2.15),那么您可能会更幸运地使用版本 1.3.0b1。

关于python - sqlalchemy 寻找字符串形式的服务器版本,而不是类似字节的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54008134/

相关文章:

c++ - 为什么叫重叠 I/O?

c - 如何在 Windows 10 上安装用于 C/C++ 并行编程的英特尔 Cilk?

c# - 在 Windows 中检测耳机

python - 使用SQLAlchemy的查询from_statement()方法时如何选择*?

php - MySQL DB,通过Python-PHP发送多条数据到服务器

python - python3 上的 SSL 错误获取请求

python - 在 anaconda 中更新 Spyder 后出现内核错误

python - 给定一个 python 2.7.2 类型,我是否可以以编程方式构造一个类实例?

sqlalchemy - SQLAlchemy 中 2 列唯一的主键

python - SQLAlchemy 和多个数据库