使用 sqlalchemy.engine.url.URL 为 mssql+pyodbc 构建连接 URL

Posted

技术标签:

【中文标题】使用 sqlalchemy.engine.url.URL 为 mssql+pyodbc 构建连接 URL【英文标题】:Building a connection URL for mssql+pyodbc with sqlalchemy.engine.url.URL 【发布时间】:2018-02-15 13:10:08 【问题描述】:

问题...

我正在尝试通过 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”错误???

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.

【问题讨论】:

您的连接 URL 缺少 ODBC 驱动程序名称。你需要类似mssql+pyodbc://scott:tiger@myhost:port/databasename?driver=SQL+Server(参考:here)的东西。 这仍然不起作用。 sqlalchemy.engine.url.URL() 没有地方放driver = SQL+Server' 【参考方案1】:

如SQLAlchemy documentation 中所述,对于mssql+pyodbc 连接

基于主机名的连接不是首选,但受支持。必须明确指定 ODBC 驱动程序名称:

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

对于

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

【讨论】:

由于 1.4.17 版 sqlalchemy 需要 sqlalchemy.engine.url.URL 来创建引擎,我们不能再只使用一个字符串(这是我的情况)这个答案在搜索了 2 天后拯救了我。

以上是关于使用 sqlalchemy.engine.url.URL 为 mssql+pyodbc 构建连接 URL的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份