gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:29:09 31 4
gpt4 key购买 nike

我不知道是什么突然导致了这种情况(我最近重新安装了 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com