关于python:使用sqlalchemy和pyodbc连接到SQL Server 2012

Connecting to SQL Server 2012 using sqlalchemy and pyodbc

我正在尝试在Python 3.3(Windows 7-64位)上使用SQLAlchemy(带有pyodbc)连接到SQL Server 2012数据库。 我可以使用直接的pyodbc进行连接,但是无法使用SQLAlchemy进行连接。 我有用于数据库访问的dsn文件设置。

我像这样直接使用pyodbc成功连接:

1
con = pyodbc.connect('FILEDSN=c:\\users\\me\\mydbserver.dsn')

对于sqlalchemy,我尝试过:

1
2
import sqlalchemy as sa
engine = sa.create_engine('mssql+pyodbc://c/users/me/mydbserver.dsn/mydbname')

create_engine方法实际上并未建立连接并成功,但是
如果我尝试使sqlalchemy实际设置连接的操作(如engine.table_names()),则需要花费一些时间,但随后返回此错误:

DBAPIError: (Error) ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect)') None None

我不确定问题出在哪里,如何查看sqlalchemy实际将哪些连接字符串传递给了pyodbc。 我已经在SQLite和MySQL中成功使用了相同的sqlalchemy类。

提前致谢!


SQLAlchemy将基于文件的DSN字符串解释为服务器名称= c,数据库名称= users

我更喜欢在不使用DSN的情况下进行连接,这是在代码迁移期间要减少的一项配置任务。

使用Windows身份验证可以使用以下语法:

1
engine = sa.create_engine('mssql+pyodbc://server/database')

或使用SQL身份验证:

1
engine = sa.create_engine('mssql+pyodbc://user:password@server/database')

SQLAlchemy在这里对不同的连接字符串选项进行了详尽的解释。


在Python 3中,您可以使用模块urllib.parse中的函数quote_plus创建连接参数:

1
2
3
4
5
6
7
8
import urllib
params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                                "SERVER=dagger;"
                                "DATABASE=test;"
                                "UID=user;"
                                "PWD=password")

engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params))

为了使用Windows身份验证,您想使用Trusted_Connection作为参数:

1
2
3
4
params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                                "SERVER=dagger;"
                                "DATABASE=test;"
                                "Trusted_Connection=yes")

在Python 2中,应改为使用库urllib中的函数quote_plus

1
2
3
4
5
params = urllib.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                          "SERVER=dagger;"
                          "DATABASE=test;"
                          "UID=user;"
                          "PWD=password")


我没有使用DSN和使用Windows身份验证的有关与MSSQL Server的连接的更新信息。在我的示例中,我有以下选择:
我的本地服务器名称是"(localdb) ProjectsV12"。从数据库属性中看到的本地服务器名称(我正在使用Windows 10 / Visual Studio 2015)。
我的数据库名称是" MainTest1"

1
engine = create_engine('mssql+pyodbc://(localdb)\ProjectsV12/MainTest1?driver=SQL+Server+Native+Client+11.0', echo=True)

需要指定连接中的驱动程序。
您可以在以下位置找到您的客户端版本:

control panel>Systems and Security>Administrative Tools.>ODBC Data
Sources>System DSN tab>Add

从列表中查找SQL Native Client版本。


只想在这里添加一些最新信息:
如果使用DSN连接进行连接:

1
engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@SOME_DSN")

如果使用主机名连接进行连接:

1
engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@HOST_IP:PORT/DATABASENAME?driver=SQL+Server+Native+Client+11.0")

有关更多详细信息,请参阅"正式文件"