Не удалось подключиться к SQL Server через pymssql

Я пытаюсь подключиться к SQL Server, работающему в системе Windows XP, из системы * nix на локальном сервере через pymssql. Однако подключение не выполняется, как показано ниже.

db = pymssql.connect(host='192.168.1.102',user='www',password='test',database='TestDB')
Traceback (most recent call last):

File "<stdin>", line 1, in <module>
File "pymssql.pyx", line 457, in pymssql.connect (pymssql.c:6041)
raise InterfaceError(e[0])
pymssql.InterfaceError: Connection to the database failed for an unknown reason.

Что я пробовал:

  1. Настройте SQL Server и браузер для работы в качестве сетевого сервера.
  2. Настройте пользователя «www». Я также протестировал этого пользователя локально в SQL Studio.
  3. Отключил брандмауэр Windows (временно, конечно).

Я ЧТО-ТО упускаю - я просто не знаю, что это такое. Я пробовал все бесконечные пункты меню в Windows безрезультатно. Одна вещь, которую я заметил, это то, что если брандмауэр Windows включен (я устанавливаю исключение для SQL Server), python долго приостанавливается, а затем выдает ошибку. Если брандмауэр выключен, ошибка возникает мгновенно.

Есть ли журналы, которые я могу просмотреть в SQL Server?


person Christopher    schedule 11.11.2010    source источник
comment
для низкоуровневой отладки используйте wireshark.   -  person mo.    schedule 11.11.2010
comment
Спасибо! Я запустил wireshark, и он предоставил некоторые данные — кажется, простой акк. Однако, похоже, не так много, чтобы продолжаться. Информация говорит ms-sql-s › 50051 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0.   -  person Christopher    schedule 11.11.2010
comment
Я вижу дальнейшие подробности. В экспертной информации указано сброс соединения (RST) - не знаю, почему.   -  person Christopher    schedule 11.11.2010
comment
Я обнаружил, что не могу подключиться по telnet 127.0.0.1 1433. Ошибка подключения. Я проверил, что сервер работает, а порт #. Я буду продолжать попытки.   -  person Christopher    schedule 11.11.2010
comment
у вас есть студия управления сервером sql?   -  person mo.    schedule 11.11.2010
comment
посмотрите здесь: go.microsoft.com/ .это то, что я получаю, когда пропускаю порт   -  person mo.    schedule 11.11.2010
comment
У меня есть SQL Server Management Studio. Я могу подключиться локально через аутентификацию SQL вместо аутентификации Windows. Однако я не могу локально подключиться через telnet к порту 1433.   -  person Christopher    schedule 11.11.2010


Ответы (3)


Понятно! Я думаю, что источником проблемы было то, что Free TDS не уделялось должного внимания. Бесплатный TDS, по-видимому, является драйвером для pymssql и обеспечивает подключение к другим базам данных, одной из которых является SQL Server.

Файл freetds.conf находится в /usr/local/etc в моей системе (Mac Book Pro).

Этот файл содержит значения по умолчанию из установки. Тем не менее, я ранее добавил определение, чтобы я мог подключиться, но забыл об этом и, к сожалению, не сделал заметок.

Во всяком случае, вот пример того, что я добавил в freetds.conf:

[SomeDB]
    host = 192.168.1.102
    port = 1219
    tds version = 7.0

Однако вызывает недоумение то, что я установил порт на 1219. Я установил его вручную на 1433 в SQL Studio. Кроме того, я использую TDS версии 0.82, поэтому не знаю, как вписывается 7.0.

Затем я протестировал подключение с помощью «tsql» следующим образом:

tsql -S SomeDB -U www

Я ввожу пароль и получаю командную строку, которая позволяет выполнять SQL-запросы.

Затем я протестировал подключение с помощью pymssql следующим образом:

db = pymssql.connect(host='SomeDB',user='www',password='cylon',database='TestDB')

Как видите, мне нужно было использовать имя хоста из файла freetds.conf, а НЕ IP напрямую. Затем я протестировал простой запрос с дополнительным кодом Python, чтобы убедиться, что я могу читать из базы данных.

Я надеюсь, что это поможет кому-то еще в будущем.

person Christopher    schedule 11.11.2010
comment
Кажется, у меня нет файла freetds.conf в моей ОС Windows. Я получаю ту же ошибку со строкой подключения: host=10.43.32.211:1433, database=v000001, trusted=True - person IAbstract; 24.03.2015
comment
о, может быть, pymssql использует не строку подключения, а именованные параметры (в отличие от некоторых других библиотек) ... немного странно, но ладно. - person IAbstract; 24.03.2015

Похоже, вы решили эту проблему, но для всех, кто попал сюда из Google: убедитесь, что на вашем MS SQL Server включена авторизация в смешанном режиме. По умолчанию разрешена только авторизация Windows, и это вызовет эту ошибку в pymssql.

person notatoad    schedule 06.06.2011

это машина с Windows, над которой вы работаете? укажите порт 1433. похоже, это ошибка в API-интерфейсе клиента mssql, который пытается использовать Namedpipes вместо TCP/IP.

person mo.    schedule 11.11.2010
comment
Спасибо! Похоже, мне нужно конкретно указать порт 1433. Wireshark показывает какой-то другой ответ без порта. С портом показывает ms-sql-s. - person Christopher; 11.11.2010