尝试使用以pyodbc
(freeTDS)作为驱动程序的SQLAlchemy连接到SQL server;如果直接使用pyodbc
,则连接成功:
>>> import pyodbc
>>> conn = pyodbc.connect('DSN=serverdsn;UID=user;PWD=password')
>>> crsr = conn.cursor()
>>> rows = crsr.execute("select @@VERSION").fetchall()
>>> print(rows)
[('Microsoft Azure SQL Data Warehouse - 10.0.9248.28 Sep 12 2017 01:08:55 Copyright (c) Microsoft Corporation', )]
>>> crsr.close()
>>> conn.close()
但当我使用SQLAlchemy时,它失败了,出现了一个神秘的错误:
>>> from sqlalchemy import create_engine
>>> e = create_engine("mssql+pyodbc://user:password@serverdsn")
>>> with e.connect() as con:
... rs = con.execute('select * from users')
... for row in rs:
... print(row)
...
下面是完整的堆栈跟踪:
回溯(最近一次调用):文件“/users/purecarscomputer/anaconda/envs/tensorflow/lib/python3.5/site-packages/sqlalchemy/pool.py”,第1122行,在_do_get中返回self._pool.get(wait,self._timeout)文件“/users/purecarscomputer/anaconda/envs/tensorflow/lib/python3.5/site-packages/sqlalchemy/util/queue.py”,第145行,在get中升起
在处理上述异常时,又发生了一个异常:
回溯(最近一次调用):文件“”,第1行,在文件“/users/pureCarsComputer/Anaconda/envs/tensorflow/lib/python3.5/site-packages/sqlalchemy/engine/base.py”中,第2091行,在connect中返回self._connection_cls(self,**kwargs)文件“/users/pureCarsComputer/Anaconda/envs/tensorflow/lib/python3.5/site-packages/sqlalchemy/engine/base.py”,第90e-packages/sqlalchemy/pool.py“,第766行,in_checkout faire=_connectionRecord.checkout(pool)文件”/users/purecarscomputer/anaconda/envs/tensorflow/lib/python3.5/site-packages/sqlalchemy/pool.py“,第516行,incheckout rec=pool._do_get()文件”ction return_connectionRecord(self)文件“/users/purecarscomputer/anaconda/envs/tensorflow/lib/python3.5/site-packages/sqlalchemy/pool.py”,第461行,在init self.connect(First_connect_check=true)文件“/users/purecarscomputer/envs/tensorflow/lib/python3.5/site-packages/sqlalchemy/pool.py”,第661行,在__connect exec_once(rscomputer/anaconda/envs/tensorflow/lib/python3.5/site-packages/sqlalchemy/connectors/pyodbc.py“,第165行,在initialize super(ms方言,self)中初始化(connection)文件”/users/purecarscomputer/anaconda/envs/tensorflow/lib/python3.5/site-packages/sqlalchemy/dialects/msql/base.py“,第1742行,在initialize(ms方言)中初始化(connection最后的错误是:%s“%(视图,err))UnboundLocalError:在赋值之前引用了局部变量”err
我试过安装和卸载sqlalchemy并在google上搜索,但没有找到解决方案。有没有人有类似的问题,对正在发生的事情有头绪?
操作系统信息:
ProductName: Mac OS X
ProductVersion: 10.12.6
BuildVersion: 16G29
下面是我用来解决具有类似症状的连接问题的连接字符串:
import urllib
from sqlalchemy import create_engine
# utilize existing odbc connection to create engine
params = urllib.quote_plus("DRIVER={}; SERVER=server; Database=database; UID=user; PWD=pw")
engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
参考http://docs.sqlalchemy.org/en/latest/dialcts/mssql.html#pass-through-exact-pyodbc-string