В Python, как подключиться к SQL Серверу через sqlalchemy с использованием DSN и SQL Аутентификация? - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь подключиться к серверу MS SQL, поэтому я создал системный DSN на сервере с драйвером 'SQL Server Native Client 11.0'. Имя DSN:

mydsn1

Я могу подключиться только с использованием SQL IP-адреса сервера и с использованием SQL Аутентификация сервера (используя идентификатор входа и пароль ). Для этого я использовал ODB C Администратор источника данных GUI и даже успешно завершил «Тестирование источника данных».

Теперь я пытаюсь проверить соединение с SQL сервер в python с использованием SQL Алхимия.

  1. Это первый использованный мной синтаксис, который работает:

import pyodbc
import sqlalchemy as sa
import urllib

driver='SQL Server Native Client 11.0'
server = '12.34.567.890'
database = 'MYDATABASE'
userid = 'Cool-USER'
password = 'P@ssword1!'

stringparams = "DRIVER={{{0}}};SERVER={1};DATABASE={2};UID={3};PWD={4}".format(driver, server, database, userid, password)
params = urllib.parse.quote_plus(stringparams)
myengine = sa.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)

cursor = myengine.raw_connection().cursor()
cursor.execute('SELECT top 3 * FROM SOME_TABLE')
for row in cursor:
    print(row)
cursor.commit()
cursor.close()

Теперь это второй синтаксис, который я пробовал, который также работает:
mystr = "mssql+pyodbc://{0}:{1}@{2}/{3}?driver={4}".format(userid, password, server, database, driver)

myengine = sa.create_engine(mystr)
cursor = myengine.raw_connection().cursor()

cursor.execute('SELECT top 3 * FROM SOME_TABLE')

for row in cursor:
    print(row)
cursor.commit()
cursor.close()

Чего я действительно хотел бы добиться, так это использовать фактический DSN, который я создал! Есть ли синтаксис с функцией create_engine() из sqlalchemy, которая использует DSN? Насколько я понимаю, так как я создал DSN (предоставив логин и пароль в SQL Authentication), мне не нужно будет снова вводить эти учетные данные при вызове функции sa.create_engine (). Однако, к сожалению, я продолжаю получать ошибки.

Это то, что я пробовал, и это НЕ работает:
driver='SQL Server Native Client 11.0'
server = '12.34.567.890'
database = 'MYDATABASE'
userid = 'Cool-USER'
password = 'P@ssword1!'
dsn = 'mydsn1'

stringparams = "DRIVER={{{0}}};SERVER={1};DATABASE={2};DSN={3}".format(driver, server, database, dsn)
params = urllib.parse.quote_plus(stringparams)
myengine = sa.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
cursor = myengine.raw_connection().cursor()

В строке появляется следующая ошибка cursor = myengine.raw_connection().cursor()

InterfaceError: (pyodbc.InterfaceError) ('28000', "[28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Login failed for user ''. (18456) (SQLDriverConnect); [28000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Login failed for user ''. (18456)")
(Background on this error at: http://sqlalche.me/e/rvf5)
  • По многим причинам мне действительно нужно использовать SQL Alchemy (а не просто pyodb c .connect ()), и я действительно надеялся, что есть способ использовать DSN без необходимости вводить пароли.

Любая помощь в этом очень ценится!

...