Не удается подключиться к базе данных SQL Server с помощью pymssql, но можно подключиться с помощью базового freetds tsql

Я понятия не имею, почему я получаю эту ошибку, и не могу найти для нее решения. Я могу подключиться к базе данных SQL Server с помощью freetds tsql, но я продолжаю получать сообщение об ошибке при подключении с использованием pymssql.connect.

Конкретная ошибка:

pymssql.OperationalError: (18456, «Ошибка входа для пользователя xxx». Сообщение об ошибке DB-Lib 18456, уровень серьезности 14: \ nОбщая ошибка SQL Server: проверьте сообщения от SQL Server. \ n Сообщение об ошибке DB-Lib 20002, уровень серьезности 9: \ nСбой подключения адаптивного сервера \ n ")

У меня есть конфигурация для freetds как:

[custom_config]
    host = myhost
    port = 1433
    tds version = 7.0
    encryption = request
    dump file = /tmp/freetds.log

Бег:

tsql -S custom_config -U tsmv -P xxx

возвращает:

locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1>

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

Однако бегущие:

python
>> import pymssql
>> pymssql.connect(server='custom_config', user='user', password='xxx',    database='database')

вызывает указанную выше ошибку.

Я использую Linux CentOS, python 2.6.6, freetds 0.92 dev (я пробовал другие версии, компилируемые с tdsver = 7.0).

Журнал freetds:

log.c:196:Starting log file for FreeTDS 0.92
on 2012-04-12 10:39:15 with debug flags 0x4fff.
iconv.c:330:tds_iconv_open(0x1391b70, ISO-8859-1)
iconv.c:187:local name for ISO-8859-1 is ISO-8859-1
iconv.c:187:local name for UTF-8 is UTF-8
iconv.c:187:local name for UCS-2LE is UCS-2LE
iconv.c:187:local name for UCS-2BE is UCS-2BE
iconv.c:349:setting up conversions for client charset "ISO-8859-1"
iconv.c:351:preparing iconv for "ISO-8859-1" <-> "UCS-2LE" conversion
iconv.c:391:preparing iconv for "ISO-8859-1" <-> "UCS-2LE" conversion
iconv.c:394:tds_iconv_open: done
net.c:205:Connecting to xx.x.x.xxx port 1433 (TDS version 7.1)
net.c:270:tds_open_socket: connect(2) returned "Operation now in progress"
net.c:310:tds_open_socket() succeeded
util.c:156:Changed query state from DEAD to IDLE
net.c:741:Sending packet
0000 12 01 00 34 00 00 00 00-00 00 15 00 06 01 00 1b |...4.... ........|
0010 00 01 02 00 1c 00 0c 03-00 28 00 04 ff 08 00 01 |........ .(......|
0020 55 00 00 02 4d 53 53 51-4c 53 65 72 76 65 72 00 |U...MSSQ LServer.|
0030 c7 39 00 00            -                        |.9..|

net.c:555:Received header
0000 04 01 00 25 00 00 01 00-                        |...%....|

net.c:609:Received packet
0000 04 01 00 25 00 00 01 00-00 00 15 00 06 01 00 1b |...%.... ........|
0010 00 01 02 00 1c 00 01 03-00 1d 00 00 ff 0a 00 0f |........ ........|
0020 a0 00 00 02 00         -                        |.....|

login.c:1057:detected flag 2
login.c:782:quietly sending TDS 7+ login packet
token.c:328:tds_process_login_tokens()
net.c:555:Received header
0000 04 01 00 72 00 51 01 00-                        |...r.Q..|

net.c:609:Received packet
0000 04 01 00 72 00 51 01 00-aa 5e 00 18 48 00 00 01 |...r.Q.. .^..H...|
0010 0e 1d 00 4c 00 6f 00 67-00 69 00 6e 00 20 00 66 |...L.o.g .i.n. .f|
0020 00 61 00 69 00 6c 00 65-00 64 00 20 00 66 00 6f |.a.i.l.e .d. .f.o|
0030 00 72 00 20 00 75 00 73-00 65 00 72 00 20 00 27 |.r. .u.s .e.r. .'|
0040 00 74 00 73 00 6d 00 76-00 27 00 2e 00 0c 4d 00 |.t.s.m.v .'....M.|
0050 43 00 53 00 2d 00 44 00-41 00 54 00 41 00 42 00 |C.S.-.D. A.T.A.B.|
0060 41 00 53 00 45 00 00 01-00 fd 02 00 00 00 00 00 |A.S.E... ........|
0070 00 00                  -                        |..|

token.c:337:looking for login token, got  aa(ERROR)
token.c:122:tds_process_default_tokens() marker is aa(ERROR)
token.c:2588:tds_process_msg() reading message 18456 from server
token.c:2661:tds_process_msg() calling client msg handler
dbutil.c:85:_dblib_handle_info_message(0x14e2e30, 0x1391b70, 0x7fff8b047e40)
dbutil.c:86:msgno 18456: "Login failed for user 'xxx'."
token.c:2674:tds_process_msg() returning TDS_SUCCEED
token.c:337:looking for login token, got  fd(DONE)
token.c:122:tds_process_default_tokens() marker is fd(DONE)
token.c:2339:tds_process_end: more_results = 0
    was_cancelled = 0
    error = 1
    done_count_valid = 0
token.c:2355:tds_process_end() state set to TDS_IDLE
token.c:2370:                rows_affected = 0
token.c:438:tds_process_login_tokens() returning TDS_FAIL
login.c:466:login packet accepted
util.c:156:Changed query state from IDLE to DEAD
util.c:331:tdserror(0x14e2e30, 0x1391b70, 20002, 0)
dblib.c:7929:dbperror(0x1383c70, 20002, 0)
dblib.c:7981:20002: "Adaptive Server connection failed"
dblib.c:8002:"Adaptive Server connection failed", client returns 2 (INT_CANCEL)
util.c:361:tdserror: client library returned TDS_INT_CANCEL(2)
util.c:384:tdserror: returning TDS_INT_CANCEL(2)
dblib.c:1443:dbclose(0x1383c70)
dblib.c:258:dblib_del_connection(0x7fa462faf540, 0x1391b70)
mem.c:615:tds_free_all_results()
dblib.c:305:dblib_release_tds_ctx(1)
dblib.c:5882:dbfreebuf(0x1383c70)
dblib.c:739:dbloginfree(0x1533a40)

Я совершенно не понимаю, почему это не работает. Любая помощь приветствуется.


person chewynougat    schedule 12.04.2012    source источник
comment
Возможно, вы захотите использовать имя сервера вместо сервера. Кроме того, я столкнулся с проблемами (по крайней мере, с pyodbc), когда строка подключения, похоже, не вела себя точно так же, как передача kwargs (хотя может быть моя ошибка ...). Вы также можете попробовать использовать pyodbc вместо pymssql (здесь нет опыта работы с pymssql).   -  person Derek Litz    schedule 18.05.2012
comment
Спасибо, Дерек, я последовал твоему совету, отказался от использования pymssql и начал использовать pyodbc с драйвером Microsoft для Linux. Теперь все работает нормально (хотя я знаю, что это не отвечает на мой первоначальный вопрос).   -  person chewynougat    schedule 18.09.2012


Ответы (4)


Сообщение «Ошибка подключения к адаптивному серверу» кажется довольно общим, но вот некоторые вещи, которые можно попробовать.

  1. Эта ветка списка рассылки (http://lists.ibiblio.org/pipermail/freetds/2010q3/026060.html) сообщает, что использование неверного протокола TDS приводит к появлению сообщения «Ошибка подключения адаптивного сервера». Кажется, что в журнале chewynougat этого нет, но, возможно, это помогает другим.

  2. В этом разделе часто задаваемых вопросов содержится множество шагов, которые можно попробовать: https://github.com/pymssql/pymssql/blob/87f4383ec153962b7ca7e63a05042d3f09005178/docs/faq.rst,

Один пытается проверить соединение tds с помощью tsql -H, который обходит чтение из conf и считывает только переданные значения. Учитывая, что приведенная выше conf содержит версию порта и протокола, возможно, стоит проверить это вместе с tsql -C, чтобы увидеть, нужны ли изменения.

  1. Also, at the bottom of the FAQ, it states that

    Настоящие сообщения «Неправильный вход в систему» ​​имеют код = 18456 и серьезность = 14

. Это сообщение об ошибке отправляется, поэтому, возможно, попробуйте аудит входа в систему (http://msdn.microsoft.com/en-us/library/ms175850.aspx), чтобы узнать, передает ли pymssql ваши учетные данные в должным образом.

  1. That same section talks about different character sets messing up the mssql.connect, so also perhaps try a basic password (i.e., ASCII 65-90) to ensure that nothing is lost in translation. It looks like Aki works with Japanese, so perhaps this is a cause as well.
person jlee-tessik    schedule 14.02.2015

Я столкнулся с той же проблемой. К счастью, я выяснил, в чем дело. На моей машине было две разные версии FreeTDS. Я установил один из них (v 0.91):

   sudo apt-get install freetds-dev

позже я узнал, что это не последняя версия, и скачал tar-файл Freetds с freetds.org. Когда я запустил tsql -C. он показал правильный путь, и я правильно обработал файл freetds.conf. При изменении переменной среды (http://www.freetds.org/userguide/envvar.htm), Я мог подключиться к базе данных. Однако каждый раз, когда я пытался подключиться через Pymssql, я получал ошибку.

Наконец, я просмотрел файл журнала и понял, что Python использует старую версию (v 0.91), но моей последней была версия 0.95.

>>> import os
>>> os.environ['TDSDUMP'] = 'stdout'
>>>
>>> import pymssql
>>> conn = pymssql.connect(server="sqlserverhost")

Итак, я удалил версию 0.91 с помощью:

sudo apt-get purge freetds-common

и pymssql подключен к правильной версии с правильной конфигурацией.

Это может помочь и вам.

person Moohebat    schedule 14.04.2016

попробуйте следовать новым примечаниям в документации pymssql: azure нужно позаботиться о пользовательской части. это так странно, но сработало. Склад ms sql делает работу на linux / mac такой сложной ..

http://pymssql.org/en/latest/azure.html

ВАЖНО: Не используйте [email protected] в качестве пользовательского параметра соответствующего вызова connect ()! Вместо этого вы должны использовать более короткую форму имени пользователя @ сервера!

введите здесь описание изображения

person coldestlin    schedule 22.03.2018

Я столкнулся с той же проблемой, когда установил через pip install pymssql, потому что это установило предварительно созданное двоичное колесо для конкретной ОС, которое не поддерживает шифрование.

Несмотря на то, что я установил определенную версию freetds, я ожидал, что она будет использоваться. Установка вместо этого с pip install --no-binary pymssql pymssql дала установку, которая работает.

Если вы хотите зашифровать соединения с базой данных, вам необходимо сначала собрать / установить freetds, а затем установить pymssql, как описано здесь.

В этом случае я настоятельно рекомендую убедиться, что в вашем файле freetds.conf указано «require», а не «request», чтобы избежать молчаливого возврата к незашифрованному трафику. Использование tcpdump -A и grepping для ключевых слов SQL может помочь определить, действительно ли зашифрован трафик.

person fifofonix    schedule 23.10.2019