web-dev-qa-db-ja.com

sqlalchemy.engine.url.URLを使用してmssql + pyodbcの接続URLを構築する

問題...

SQLAlchemyを介してMSSqlサーバーに接続しようとしています。これが偽の資格情報を持つ私のコードです(明らかに私の本当の資格情報ではありません)。

コード...

credentials = {
'username'  : 'SPOTTER_xyz_ACC',
'password'  : '123Goodbye2016!@#',
'Host'      : 'MARYLQLT01',
'database'  : 'LRS_DUS',
'port'      : '1560'}

connect_url = sqlalchemy.engine.url.URL(
    'mssql+pyodbc',
    username=credentials['username'],
    password=credentials['password'],
    Host=credentials['Host'],
    port=credentials['port'],
    query=dict(service_name=credentials['database']))

engine = create_engine(connect_url)
connection=engine.connect()

そして、これは私が得ている.pyodbcエラーです。

(pyodbc.Error) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source
name not found and no default driver specified (0) (SQLDriverConnect)')

さらなる詳細

しかし、これが奇妙なことです... pyodbc接続を確立してPandas.read_sqlを使用すると、エラーなしでデータを取得できます。だから私はなぜ私が 'pyodbc'エラーを受け取っているのか分かりませんか????

connection=pyodbc.connect(\
                          'Driver={SQL Server}; \
                          Server=MARYLQLT01; \
                          Database=LRS_DUS; \
                          UID=SPOTTER_xyz_ACC; \
                          PWD=123Goodbye2016!@#')

stmt='select * from PD_SC_All'
df=pd.read_sql(stmt,connection)

そして、データフレームを見ることができます。

では、SQLAlchemyに接続しようとすると、なぜ(pyodbc.Error)が表示されるのですか?

システムインフォメーション

Windows 7
SQLAlchemy: 1.1.11
pyodbc: 4.0.16

Python 3.6.1 |Anaconda custom (64-bit)| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.

IPython 5.3.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.
6
Clay

SQLAlchemyドキュメント に記載されているように、mssql+pyodbc接続の場合

ホスト名ベースの接続は推奨されませんが、サポートされています。 ODBCドライバー名は明示的に指定する必要があります:

engine = create_engine("mssql+pyodbc://scott:tiger@myhost:port/databasename?driver=SQL+Server+Native+Client+10.0")

For

credentials = {
    'username': 'scott',
    'password': 'tiger',
    'Host': 'myhost',
    'database': 'databasename',
    'port': '1560'}

あなたの声明

connect_url = sqlalchemy.engine.url.URL(
    'mssql+pyodbc',
    username=credentials['username'],
    password=credentials['password'],
    Host=credentials['Host'],
    port=credentials['port'],
    query=dict(service_name=credentials['database']))

connect_urlを生成します

mssql+pyodbc://scott:tiger@myhost:1560?service_name=databasename

本当に必要なのは

connect_url = sqlalchemy.engine.url.URL(
    'mssql+pyodbc',
    username=credentials['username'],
    password=credentials['password'],
    Host=credentials['Host'],
    port=credentials['port'],
    database=credentials['database'],
    query=dict(driver='SQL+Server'))

を生成します

mssql+pyodbc://scott:tiger@myhost:1560/databasename?driver=SQL+Server
10
Gord Thompson