sqlalchemy ищет версию сервера как строку, а не как байтовый объект - PullRequest
0 голосов
/ 02 января 2019

Я не знаю, что внезапно вызвало это (я недавно переустановил 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 на моем собственном компьютере (например, обработку байт-подобного объекта), потому что у нас есть другие члены команды, которые также будут скачивать vanilla sqlalchemy & pypyodbc и выиграть 'не уверен в редактировании этого исходного кода.

1 Ответ

0 голосов
/ 03 января 2019

Я подтвердил поведение pypyodbc в Python 3.6.4.

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'

Обратите внимание, что mssql+pyodbc диалект SQLAlchemy закодирован для pyodbc, а не py py odbc, и дване гарантируется совместимость на 100%.

Очевидным решением будет использование pyodbc.

ОБНОВЛЕНИЕ:

Проверьте свою версию SQLAlchemy,Я только что посмотрел на текущий исходный код для mssql+pyodbc диалекта , и он делает

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.

...