SQL Server, Python и OS X

Каким образом можно использовать интерфейс Python в OS X с облачной базой данных SQL Server?

EDIT:

С pyodbc я получаю эту ошибку:

>>> import pyodbc
>>> cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=adsf.com;DATABASE=asdf;UID=asdf;PWD=asdf')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
pyodbc.Error: ('00000', '[00000] [iODBC][Driver Manager]dlopen({SQL Server}, 6): image not found (0) (SQLDriverConnect)')

Ответ 1

SQLAlchemy, вероятно, ваш лучший выбор. Он имеет ORM, но не требует его использования. MS SQL поддерживается несколькими проектами DBAPI.

Что касается интерфейсов нижнего уровня, здесь три проекта DBAPI, перечисленные на сайте SQLAlchemy, поддерживающие ванильную Python и Unix:

  • pymssql представляется самым простым в настройке; он не требует FreeTDS.
  • pyodbc, по-видимому, находится в более активном развитии, чем pymssql.
  • mxODBC - это коммерчески лицензированный интерфейс для многих баз данных.

Ответ 2

Резюме

Я использую Mac на Yosemite версии 10.10.1, пытаясь подключиться к базе данных MS SQL Server. Я искал и не мог найти обновленный подробный ответ, поэтому здесь вы можете написать, что в основном из этой удивительной статьи здесь. Я добавляю его в stackoverflow в случае, если ссылка умирает. Идея состоит в том, что у нас будут следующие уровни для настройки/подключения.

Слои

  • ЧАСТЬ 1 - pyodbc
  • ЧАСТЬ 2 - freeTDS (можно проверить с помощью tsql)
  • ЧАСТЬ 3 - unixODBC (можно проверить с помощью isql)
  • ЧАСТЬ 4 - MS SQL (можно проверить с помощью обычной программы python)

Шаги

  • Установите Homebrew из здесь - это менеджер пакетов для Mac OSX. В статье показано, как использовать другой менеджер пакетов "MacPorts". По моим указаниям, они с доморощенным. В основном доморощенный имеет папку "подвал", в которой хранятся разные версии пакетов. Вместо того, чтобы изменять ваши обычные файлы, вместо этого они указывают на эти пакеты homebrew.

  • Нам нужно установить Pyodbc, но pyodbc использует драйверы iODBC по умолчанию (который устанавливается с помощью mac), но у многих людей есть проблемы, заставляющие его работать. Итак, мы собираемся использовать альтернативу под названием unixodbc, которую мы будем устанавливать в будущем. На данный момент нам нужно настроить установку pyopbc таким образом, чтобы она работала с unixodbc.

Перейдите в PyPi и загрузите tarobot и распакуйте его. Затем измените эти строки в setup.py:

elif sys.platform == 'darwin':
        # OS/X now ships with iODBC.
        settings['libraries'].append('iodbc')

в

elif sys.platform == 'darwin':
        # OS/X now ships with iODBC.
        settings['libraries'].append('odbc')

и теперь выполняйте python setup.py install.

Это приводит к тому, что установка pyodbc использует драйверы unixodbc по умолчанию. Отлично!

  1. Установить FreeTDS с помощью brew install freetds --with-unixodbc (FreeTDS - это драйвер, который находится между Mac ODBC и MS SQL Server, this диаграмма показывает, какую версию TDS вы должны использовать на основе вашей конкретной версии Microsoft Server, например, tds protocol 7.2 для Microsoft SQL Server 2008).

  2. Настроить freetds.conf файл (файл должен находиться в '/usr/local/etc/freetds.conf', который для Homebrew является ссылкой, чтобы сказать '/usr/local/Cellar/freetds/0.91_2/etc ', но ваш может быть где-то другим в зависимости от версии). Я редактировал глобальную информацию и добавлял информацию о моей базе данных до конца (по какой-либо причине "tds version = 7.2" выдавала бы ошибку, но все равно работала, а 8.0 просто работает):

    [global]
    # TDS protocol version
    tds version = 8.0
    
    [MYSERVER]
    host = MYSERVER
    port = 1433
    tds version = 8.0
    
  3. Проверить, что FreeTDS установлен правильно: tsql -S myserver -U myuser -P mypassword (вы должны увидеть приглашение вроде этого, если оно сработало)

    locale is "en_US.UTF-8"
    locale charset is "UTF-8"
    using default charset "UTF-8"
    1>
    
  4. Установите unixODBC с помощью brew install unixodbc.

  5. Настройте конфигурационные файлы unixODBC, который включает odbcinst.ini (конфигурация драйвера) и odbc.ini (конфигурация DSN файл). По умолчанию мои файлы были: /Library/ODBC (Примечание: НЕ моя пользовательская библиотека aka/Users/williamliu/Library). Или они также могут быть в вашем каталоге установки homebrew /usr/local/Cellar/unixodbc/<version>/etc.

  6. Откройте файл odbcinst.ini и добавьте следующее (Примечание: разные, если вы используете MacPorts. Для Homebrew этот файл является ссылкой на версию homebrew, например, мою находится в '/usr/local/Cellar/freetds/0.91_2/lib/libtdsodbc.so'):

    [FreeTDS]
    Description=FreeTDS Driver for Linux & MSSQL on Win32
    Driver=/usr/local/lib/libtdsodbc.so
    Setup=/usr/local/lib/libtdsodbc.so
    UsageCount=1
    
  7. Откройте " odbc.ini", а затем добавьте следующее (обычно это вместе с odbcinst.ini:

    [MYSERVER]
    Description         = Test to SQLServer
    Driver              = FreeTDS
    Trace               = Yes
    TraceFile           = /tmp/sql.log
    Database            = MYDATABASE
    Servername          = MYSERVER
    UserName            = MYUSER
    Password            = MYPASSWORD
    Port                = 1433
    Protocol            = 8.0
    ReadOnly            = No
    RowVersioning       = No
    ShowSystemTables    = No
    ShowOidColumn       = No
    FakeOidIndex        = No
    
  8. Убедитесь, что unixODBC установлен правильно: isql MYSERVER MYUSER MYPASSWORD. Если вы получите сообщение об ошибке, которое невозможно подключить, добавьте -v, чтобы проверить, что такое подробный вывод, и исправить его. В противном случае вы должны увидеть это:

    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+ 
    
  9. Теперь проверить pyodbc работает с помощью программы python. Запустите python в оболочке или файл .py с этим, и вы должны вернуть свой запрос:

    import pyodbc
    import pandas
    import pandas.io.sql as psql
    
    cnxn = pyodbc.connect('DSN=MYSERVER;UID=MYUSER;PWD=MYPASSWORD')
    cursor = cnxn.cursor()
    sql = ("SELECT * FROM dbo.MYDATABASE")
    df = psql.frame_query(sql, cnxn)
    

Вы можете обратиться к документации pyobbc, чтобы получить дополнительную помощь после этого.

Ответ 3

Я смог упростить это и неоднократно работал в моей среде по состоянию на май 2016 года:

Установка FreeTDS

brew install freetds --with-unixodbc

Установить PYODBC

Экстраполировано из Ссылка

pip install -U \
    --global-option=build_ext \
    --global-option="-I/usr/local/include" \
    --global-option="-L/usr/local/lib" \
    pyodbc

Сообщите UnixODBC о драйвере FreeTDS

Примечание. У вас может быть другая версия

cat <<'EOF' >> /usr/local/Cellar/unixodbc/2.3.4/etc/odbcinst.ini
[FreeTDS]
Description=FreeTDS Driver for Linux & MSSQL on Win32
Driver=/usr/local/lib/libtdsodbc.so
Setup=/usr/local/lib/libtdsodbc.so
UsageCount=1
EOF

Оттуда я должен был сказать pyodbc, чтобы использовать драйвер FreeTDS:

dsn = 'DRIVER=FreeTDS;DATABASE=MyDb;SERVER=...'

Это потрясающе, поскольку теперь вы можете использовать его с помощью aioodbc, если вы выполняете асинхронное программирование в Python 3.x:

async with aioodbc.connect(dsn=dsn, loop=asyncio.get_event_loop()) as conn:
    async with conn.cursor() as cur:
        await cur.execute('SELECT 42')
        r = await cur.fetchall()
        print(r)

Альтернативно: вы можете использовать pymssql, но это не сработает, если вы хотите использовать odbc или asyncio.

Ответ 4

Ответ будет очень полезен для меня.

Вот несколько заметок о двух различиях, которые я испытал на этом пути, в случае, если они помогают другим:

  • pyodbc tarball уже потребовалось изменение, поэтому все, что мне нужно было сделать, это загрузить его и запустить python setup.py install. (Примечание. Версия, которую я установил с помощью pip, все еще использовала iodbc, поэтому она не работала.

  • Шаг Verify FreeTDS installed не позволял мне подключаться к базе данных, потому что у меня нет доступа к master, и, по-видимому, нет способа указать. Это, похоже, хорошо известная проблема. Я потратил кучу времени, пытаясь его решить, но потерпел неудачу и, в конце концов, не заблокировал другие шаги от работы.

  • В этих инструкциях указывается имя пользователя и пароль в odbc.ini. Поскольку нам нужно снова сказать учетные данные при входе в систему, я попытался удалить UserName и Password из odbc.ini, надеясь, что они действительно не нужны. (Я предпочел бы, чтобы мой пароль записывался в меньшем количестве мест!) Это отлично работало.

  • Мне пришлось добавить хост к идентификатору пользователя в isql MYSERVER [email protected] MYPASSWORD (и в коде Python).

(Я надеялся, что это будет означать, что мне не нужен хост в freetds.conf, но, увы, это должно остаться.)

Ответ 5

Я на macOS Sierra 10.12.3. pymssql отлично справился с этой задачей. Если ничего не работает из других утвержденных ответов, выполните следующие действия:

brew unlink freetds
brew install homebrew/versions/freetds091
pip install pymssql

и вот пример фрагмента для установления соединения:

conn = pymssql.connect(serverhostname, username, password, dbname)
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')

Ответ 6

Есть много обручей, чтобы прыгать. Ответ будет охарактеризован из их числа.

После большой борьбы мне удалось заставить это работать с Docker (так что это должно работать везде, где работает докер).

Я тестировал установку с помощью Python 3.6 и Python 2.7: с pyodbc == 3.0.10, django-pyodbc-azure и Django 1.10.4 (эта настройка для Django, но также работает и на vanilla python).

Я создал общий образ, который вы можете использовать: https://hub.docker.com/r/toast38coza/python-mssql/

Вот простая рабочая настройка докеры:

version: "3"
services:
  db:
    restart: on-failure:10
    image: microsoft/mssql-server-linux:latest
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=SuperSecret(!)100
    ports:
      - "1433:1433"
  py:
    image: toast38coza/python-mssql
    links:
      - db
    environment:
      - SA_PASSWORD=SuperSecret(!)100
      - DB_NAME=mydb

Теперь вы можете запустить:

docker-compose run --rm py python

Что будет запускать python cli внутри службы py выше

Затем попробуйте создать базу данных:

>>> import pyodbc, os
>>> db_name = os.environ.get('DB_NAME')
>>> pwd = os.environ.get('SA_PASSWORD')
>>> connection_string = "driver=FreeTDS;server=db;PORT=1433 database=master;UID=sa;PWD={};TDS_Version=8.0;".format(pwd)
>>> conn = pyodbc.connect(connection_string, autocommit=True)
>>> conn.execute('create database {}'.format(db_name))
<pyodbc.Cursor object at 0x7fb3067f0e70>

Это должно создать базу данных под названием mydb (DB_NAME из переменной файла файловой среды docker-compose). Примечание: поскольку мы создали ссылку на службу db (с запуском MS SQL), мы можем использовать имя хоста db. Если вы подключаетесь к внешней настройке MS SQL, вам явно не нужна услуга db (и соответственно отредактируйте строку подключения).

Если вы используете Django, более полный пример в репо, но вам просто понадобится хедз-ап. ваш settings выглядит примерно так:

DATABASES = {
    'default': {
        'ENGINE': "sql_server.pyodbc",
        'HOST': "db",
        'PORT':'1433',
        'USER': "sa",
        'PASSWORD': os.environ.get('SA_PASSWORD'),
        'NAME': os.environ.get('DB_NAME'),
        'OPTIONS': {
            "driver": "FreeTDS",
            "host_is_server": True,
            "unicode_results": True,
            "extra_params": "tds_version=8.0",
        }
    }
}

Ответ 7

Pyodbc + MS собственный поставщик odbc, msodbcsql, а не FreeTDS. Мое рассуждение было простым - кто больше всего заинтересован в хорошей поддержке SQL Server? МС.

https://docs.microsoft.com/en-us/azure/sql-database/sql-database-connect-query-python

Это было довольно просто, основная проблема заключается в том, что их установщик работает только с Homebrew, а не macports, что я обычно использую. Сначала я попытался установить Homebrew в свой домашний каталог, но фактические драйверы не были "видны" pyodbc таким образом, как и стандартная установка Homebrew, затем brew install msodbcsql. Это привело к следующим пакетам:

(venv) [email protected]$ brew list
 msodbcsql  openssl     unixodbc

Соедините строку, которая сработала для меня:

Driver={ODBC Driver 13 for SQL Server};Server=192.168.1.xxx;Database=mydb;Uid=myuser;Pwd=mypassword;

А для SQL Alchemy:

"mssql+pyodbc://%(user)s:%(password)[email protected]%(hostname)s:%(port)s/%(dbname)s?driver=ODBC+Driver+13+for+SQL+Server"

Если вы также устанавливаете MS SQL Server (я получил версию Developer Edition 2016), не забудьте: 1) использовать диспетчер конфигурации SQL Server (SQLServerManager13.msc), чтобы включить TCPIP на порт 1433, для вашего IP. 2) открыть порт 1433 в Брандмауэре Windows (wf.msc). Инструкции по настройке MS

Версии: Sierra, Python 2.7, выпуск SQL Server 2016 Dev, Win 10 Pro.