Python с MS SQL — усеченный вывод

Я пытаюсь подключиться к базе данных MSSQL с помощью python из коробки Linux (Python 2.7, Ubuntu 11.04). Вывод, который я получаю, усекается до 500 символов. Пожалуйста, смотрите скрипт и конфиги ниже. Как это можно решить? Проблема полагаю в драйвере ODBC или рядом с ним.

Код (pyodbc, pymssql):

conn = pymssql.connect(host='my_remote_host', user='ro_user',
password='password', database='current', as_dict=True)
cur = conn.cursor()
cur.execute(sql)
for i in cur:
    print i
conn.close()

cnxn = pyodbc.connect(driver='FreeTDS', server='my_remote_host', database='current', uid='ro_user', pwd='password')
cursor = cnxn.cursor()
cursor.execute(sql)
rows = cursor.fetchall()
...
cnxn.close()  

У меня нет доступа на запись к БД MS SQL, это фактически удаленный сервер, который не принадлежит нашей системе.

SQL:

sql = '''
        SELECT  Req.ID,
        ShReq.Summary AS [Short Name],
        ShReq.ALM_SharedText AS [Text],
        Req.ContainedBy,
        Req.DocumentID
FROM    CurMKS..ALM_Requirement Req
        JOIN CurMKS..ALM_SharedRequirement ShReq ON Req.[References] = ShReq.ID
        WHERE DocumentID = 1111111'''

Проблема с полем ShReq.ALM_SharedText. Оно усекается до 255 символов, но с помощью таких преобразований, как convert(text,ShReq.ALM_SharedText) AS TEXT и CAST(ShReq.ALM_SharedText AS TEXT), я увеличиваю усечение до 500 символов. Однако есть поля с более длинным текстом, чем 500 символов, и они усекаются.

Параметры ODBC:

/etc/odbc.ini:

[MKS]
#Driver=FreeTDS
Driver=/usr/lib/odbc/libtdsodbc.so
Description=Database
Trace=No
Server=my_remote_host
Port=1433
Database=current
UID=ro_user
PWD=password
TDS Version=8.0

/etc/odbcinst.ini:

[FreeTDS]
Description=FreeTDS
Driver=/usr/lib/odbc/libtdsodbc.so
UsageCount=1

/etc/freetds/freetds.conf:

[global]
        tds version = 8.0
;       dump file = /tmp/freetds.log
;       debug flags = 0xffff
;       timeout = 10
;       connect timeout = 10
;       text size = 2097152


[mksserver]
      host = my_remote_host
      port = 1433
      tds version = 8.0
      client charset = UTF-8

Есть мысли как это можно решить?


person DominiCane    schedule 09.08.2012    source источник
comment
Пробовали ли вы увеличить параметр text size в соответствии с направленным?   -  person Bryan    schedule 09.08.2012
comment
пробовал увеличивать и удалять, на самом деле я не заметил никаких изменений.   -  person DominiCane    schedule 09.08.2012
comment
Итак, вы пытались увеличить значение в файле конфигурации, но установили ли вы TEXTSIZE в SQL?   -  person Bryan    schedule 09.08.2012
comment
Вы используете pymssql, pyodbc или оба?   -  person Bryan    schedule 09.08.2012
comment
@beargle, как описано в примерах — как pyodbc, так и pymssql. Как установить TEXTSIZE в SQL??   -  person DominiCane    schedule 10.08.2012
comment
Настройка TEXTSIZE для SQL есть в моем ответе. Любопытно, почему вы используете оба пакета для одного и того же запроса?   -  person Bryan    schedule 10.08.2012


Ответы (3)


Измените text size в разделе global файла freetds.conf на максимальное (4294967295 байт):

[global]
    tds version = 8.0
    text size = 4294967295

Также необходимо установить TEXTSIZE в SQL на максимум (2147483647 байт):

sql = """
    SET TEXTSIZE 2147483647;
    SELECT  Req.ID,
            ShReq.Summary AS [Short Name],
            ShReq.ALM_SharedText AS [Text],
            Req.ContainedBy,
            Req.DocumentID
    FROM    CurMKS..ALM_Requirement Req
            JOIN CurMKS..ALM_SharedRequirement ShReq ON Req.[References] = ShReq.ID
    WHERE DocumentID = 111111;
      """
person Bryan    schedule 09.08.2012

Если вы используете более старую версию pymssql (1.0.2), существуют определенные ограничения.

Данные varchar и nvarchar ограничены 255 символами, а более длинные строки автоматически обрезаются. Это известное ограничение протокола TDS. Обходной путь заключается в CAST или CONVERT этой строки или выражения в текстовый тип данных, который может возвращать 4000 символов.

источник: http://pymssql.sourceforge.net/limitations.php

person anuj sadani    schedule 08.01.2013

Вы можете использовать следующую логику, чтобы получить полный вывод от SQL Server:

rows = connCursor.execute(spQuery).fetchall()
result = ''
result = result.join([row[0] for row in rows])

Здесь spQuery — это полный SQL-запрос, который мы будем выполнять для получения результата.
Результат, который мы возвращаем, обрезается после 2033 символов, поэтому мы будем объединять весь вывод в одну строку и выполнять следующие операции.

person Prasad Nadiger    schedule 23.04.2021