使用sqlalchemy和pyodbc连接到SQL Server 2012

Bra*_*ell 21 python sql-server sqlalchemy pyodbc

我正在尝试使用Python 3.3(Windows 7-64位)上的SQLAlchemy(使用pyodbc)连接到SQL Server 2012数据库.我能够使用直接pyodbc进行连接,但是在使用SQLAlchemy进行连接时却没有成功.我有数据库访问的dsn文件设置.

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

con = pyodbc.connect('FILEDSN=c:\\users\\me\\mydbserver.dsn')
Run Code Online (Sandbox Code Playgroud)

对于sqlalchemy,我尝试过:

import sqlalchemy as sa
engine = sa.create_engine('mssql+pyodbc://c/users/me/mydbserver.dsn/mydbname')
Run Code Online (Sandbox Code Playgroud)

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类.

提前致谢!

Bry*_*yan 32

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

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

此语法使用Windows身份验证:

engine = sa.create_engine('mssql+pyodbc://server/database')
Run Code Online (Sandbox Code Playgroud)

或者使用SQL身份验证:

engine = sa.create_engine('mssql+pyodbc://user:password@server/database')
Run Code Online (Sandbox Code Playgroud)

SQLAlchemy 在此处对不同的连接字符串选项进行了详尽的说明.

  • 谢谢.SQL Server实例是唯一一个不在我正在处理的机器上的实例,所以我不确定这里是否有一些有趣的东西.只是为了扩展一下你列出的蜇(因为sql server实例显然是命名的) - `sa.create_engine('mssql + pyodbc:// [machinename] \\ [servername]/[database]')` (3认同)
  • `engine = sa.create_engine('mssql+pyodbc://user:password@server/database')` <br> 你必须添加这个 `?driver=SQL+Server+Native+Client+11.0` 所以最终将是`engine = sa.create_engine('mssql+pyodbc://user:password@server/database?driver=SQL+Server+Native+Client+11.0')` (3认同)

And*_*rew 18

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

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

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

控制面板>系统和安全>管理工具.> ODBC数据源>系统DSN选项卡>添加

从列表中查看SQL Native客户端版本.

  • 就我而言,`?driver=SQL+Server+Native+Client+11.0` 是我正在寻找的字符串。太懒了,找不到我的旧代码:D (2认同)

小智 18

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

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))
Run Code Online (Sandbox Code Playgroud)

要使用Windows身份验证,您希望使用Trusted_Connection作为参数:

params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                                 "SERVER=dagger;"
                                 "DATABASE=test;"
                                 "Trusted_Connection=yes")
Run Code Online (Sandbox Code Playgroud)

在Python 2中,您应该使用quote_plus库中的函数urllib:

params = urllib.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                           "SERVER=dagger;"
                           "DATABASE=test;"
                           "UID=user;"
                           "PWD=password")
Run Code Online (Sandbox Code Playgroud)

  • 对于python 3,我们应该使用urllib.parse.quote_plus (2认同)

ssw*_*ord 7

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

engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@SOME_DSN")
Run Code Online (Sandbox Code Playgroud)

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

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

详情请参阅“官方文档”