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

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

Я успешно подключаюсь с помощью прямого pyodbc следующим образом:

con = pyodbc.connect('FILEDSN=c:\\users\\me\\mydbserver.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.

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


person Brad Campbell    schedule 01.04.2013    source источник
comment
Я обнаружил, что документация SQLAlchemy крайне неадекватна по этой теме. Улучшения там требуются.   -  person Maddenker    schedule 04.10.2019


Ответы (6)


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

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

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

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

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

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

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

person Bryan    schedule 01.04.2013
comment
Спасибо. Экземпляр SQL Server - единственный, которого нет на машине, над которой я работаю, поэтому я не был уверен, что здесь происходит что-то забавное. Просто чтобы немного расширить перечисленные вами жалобы (поскольку экземпляры sql-сервера явно названы) - sa.create_engine('mssql+pyodbc://[machinename]\\[servername]/[database]') - person Brad Campbell; 02.04.2013
comment
Их не нужно называть. На самом деле проще подключиться и использовать экземпляр сервера sql, настроенный как экземпляр по умолчанию. Именованные экземпляры необходимы, если вы будете размещать несколько экземпляров sql-сервера на одном сервере. - person marr75; 05.05.2014
comment
Эта ссылка не работает. Думаю, это подходящая замена: docs.sqlalchemy.org/ ru / latest / core /otors.html # database-urls - person BallpointBen; 05.06.2018
comment
engine = sa.create_engine('mssql+pyodbc://user:password@server/database') ‹br› вы должны добавить это ?driver=SQL+Server+Native+Client+11.0, так что окончательное будет engine = sa.create_engine('mssql+pyodbc://user:password@server/database?driver=SQL+Server+Native+Client+11.0') - person Sebastin Ignacio Camilla Trinc; 21.06.2020

В 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")
person pooja karande    schedule 18.03.2018
comment
Для python 3 мы должны использовать urllib.parse.quote_plus - person ssword; 27.03.2018

У меня есть обновленная информация о подключении к серверу MSSQL без использования DSN и проверки подлинности 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> вкладка Системный DSN> Добавить

Посмотрите в списке версию SQL Native client.

person Andrew    schedule 20.04.2016
comment
Это единственное, что у меня сработало. Большое спасибо! - person Barka; 20.02.2018
comment
В моем случае?driver=SQL+Server+Native+Client+11.0 был той строкой, которую я искал. Был слишком слаб, чтобы найти мой старый код: D - person Supun De Silva; 03.05.2020
comment
@SupunDeSilva, это именно то, что мне самому было нужно. Большое спасибо. Хотел бы я проголосовать за ваш комментарий и ответ Эндрю 10000 раз. - person Chicken Sandwich No Pickles; 26.05.2020
comment
Обратите внимание, что другие расположения драйверов в системах * NIX также работают хорошо. В OSX я использовал driver=/usr/local/lib/libtdsodbc.so - person Peter; 09.04.2021

Просто хочу добавить сюда последнюю информацию: Если вы подключаетесь с использованием 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")

Для получения дополнительных сведений см. «Официальный документ» < / а>

person ssword    schedule 27.03.2018

Я делал по-другому и работал как шарм.

Сначала вы импортируете библиотеку:

import pandas as pd
from sqlalchemy import create_engine
import pyodbc

Создайте функцию для создания движка

def mssql_engine(user = os.getenv('user'), password = os.getenv('password')
                 ,host = os.getenv('SERVER_ADDRESS'),db = os.getenv('DATABASE')):
    engine = create_engine(f'mssql+pyodbc://{user}:{password}@{host}/{db}?driver=SQL+Server')
    return engine

Создайте переменную с вашим запросом

query = 'SELECT * FROM [Orders]'

Выполните команду Pandas, чтобы создать фрейм данных из таблицы MSSQL.

df = pd.read_sql(query, mssql_engine())
person Hugo Pitta    schedule 09.04.2020

import pyodbc 
import sqlalchemy as sa
engine = sa.create_engine('mssql+pyodbc://ServerName/DatabaseName?driver=SQL+Server+Native+Client+11.0',echo = True)

Это работает с проверкой подлинности Windows.

person Teja Goud Kandula    schedule 20.04.2021