Подключение к 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")
для больше деталей, пожалуйста см. "Официальный Документ"