Подключение к SQL Server 2012 с помощью sqlalchemy и pyodbc

Я пытаюсь подключиться к базе данных SQL Server 2012 с помощью SQLAlchemy (с pyodbc) на Python 3.3 (Windows 7-64-бит). Я могу подключиться с помощью прямого pyodbc, но не удалось подключиться с помощью SQLAlchemy. У меня есть настройка файла dsn для доступа к базе данных.

я успешно подключаюсь, используя прямой pyodbc, как это:

con = pyodbc.connect('FILEDSN=c:usersmemydbserver.dsn')

для sqlalchemy я пробовал:

import sqlalchemy as sa
engine = sa.create_engine('mssql+pyodbc://c/users/me/mydbserver.dsn/mydbname')

на create_engine метод фактически не устанавливает соединение и успешно, но если я попробую что-то, что заставляет sqlalchemy фактически настроить соединение (например,engine.table_names()), а затем возвращает эту ошибку:

DBAPIError: (Error) ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect)') None None

Я не уверен, где что-то идет не так, как увидеть, какая строка подключения фактически передается pyodbc sqlalchemy. Я успешно использую те же классы sqlalchemy с SQLite и MySQL.

спасибо заранее!

4 ответов


строка DSN на основе файла интерпретируется SQLAlchemy как имя сервера = c имя базы данных = users.

Я предпочитаю подключение без использования DSNs, это одна задача конфигурации меньше, чтобы иметь дело с во время миграции кода.

этот синтаксис работает с использованием проверки подлинности Windows:

engine = sa.create_engine('mssql+pyodbc://server/database')

или с аутентификацией SQL:

engine = sa.create_engine('mssql+pyodbc://user:password@server/database')

SQLAlchemy имеет подробное объяснение различных параметров строки подключения здесь.


У меня есть информация об обновлении подключения к серверу MSSQL без использования DSNs и проверки подлинности Windows. В моем примере у меня есть следующие варианты: Мое имя локального сервера- "(localdb)\ProjectsV12". Имя локального сервера я вижу из свойств базы данных (я использую Windows 10 / Visual Studio 2015). Мое имя БД - "MainTest1"

engine = create_engine('mssql+pyodbc://(localdb)\ProjectsV12/MainTest1?driver=SQL+Server+Native+Client+11.0', echo=True)

необходимо указать драйвер в соединении. Вы можете найти свою версию клиента в:

панель управления>системы и Безопасность>Администрирование.>Данные ODBC Источники>вкладка System DSN>добавить

посмотрите на версию собственного клиента SQL из списка.


в Python 3 Вы можете использовать функцию quote_plus модуль urllib.parse для создания параметров подключения:

import urllib
params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                                 "SERVER=dagger;"
                                 "DATABASE=test;"
                                 "UID=user;"
                                 "PWD=password")

engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params))

чтобы использовать проверку подлинности Windows, вы хотите использовать параметр trusted_connection параметр:

params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                                 "SERVER=dagger;"
                                 "DATABASE=test;"
                                 "Trusted_Connection=yes")

в Python 2, вы должны использовать функцию quote_plus библиотека urllib вместо:

params = urllib.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                           "SERVER=dagger;"
                           "DATABASE=test;"
                           "UID=user;"
                           "PWD=password")

просто хочу добавить последнюю информацию здесь: Если вы подключаетесь с помощью DSN-соединений:

engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@SOME_DSN")

Если вы подключаетесь с помощью соединений с именем хоста:

engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@HOST_IP:PORT/DATABASENAME?driver=SQL+Server+Native+Client+11.0")

для больше деталей, пожалуйста см. "Официальный Документ"