使用SQLAlchemy连接到SQL Server

dav*_*ode 5 sql-server odbc sqlalchemy unixodbc pyodbc

我正在尝试使用SQLALchemy和pyodbc连接到SQL Server Express数据库,但我不断收到错误:

(pyodbc.Error)('IM002','[IM002] [unixODBC] [驱动程序管理器]未找到数据源名称,并且未指定默认驱动程序(0)(SQLDriverConnect)')

我真的不明白我的引擎网址是错还是其他什么.我的方案如下:

  • 我在Mac上
  • 我有一个docker容器(基于带有和的Debian图像),我的python应用程序尝试连接到...unixodbcunixodbc-dev
  • 一个VirtualBox的虚拟机上运行的Windows 8与SQL Express的2014 ...

我使用SQL Server身份验证为SQL Express配置了一个用户:

  • user:ar_user
  • 密码:ar_psw

...然后:

  • 我将TCP端口配置为1433并禁用动态端口(SQL Server配置管理器>网络配置>协议).
  • 我关闭了Windows防火墙.
  • 我为运行windows8的VM使用了仅限主机的适配器

现在...

可以从主机(我的mac)访问VM,因为:

ping -c 3 vm-ip
Run Code Online (Sandbox Code Playgroud)

成功!

但是,虽然我尝试了用户,密码,IP,服务器名称和端口的所有可能的排列:

  • 'mssql+pyodbc://ar_user:ar_psw@vm-ip/master'
  • 'mssql+pyodbc://ar_user:ar_psw@vm-ip:1433/master'
  • 'mssql+pyodbc://IE10WIN8\\SQLEXPRESS'
  • 'mssql+pyodbc://ar_user:ar_psw@IE10WIN8\\SQLEXPRESS'
  • 'mssql+pyodbc://ar_user:ar_psw@IE10WIN8\\SQLEXPRESS:1433'
  • 'mssql+pyodbc://ar_user:ar_psw@IE10WIN8\\SQLEXPRESS:1433/master'

...还有很多!

我总是得到"数据源未找到错误".我该怎么办?

ps:即使在docker容器中,vm也可以ping通!

更新(已解决但不是100%):

我这样解决了:

我用/etc/odbcinst.ini这种方式配置了FreeTDS驱动程序:

[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
client charset = UTF-8
Run Code Online (Sandbox Code Playgroud)

并在/etc/freetds/freetds.conf:

[global]
tds version = 7.3
client charset = UTF-8
Run Code Online (Sandbox Code Playgroud)

然后我使用以下字符串创建引擎:

'mssql+pyodbc://my_user:my_psw@machine_ip:1433/my_db?driver=FreeTDS'
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常,但我得到这个警告:

SAWarning:无法识别的服务器版本信息'95 .12.255'.版本特定的行为可能无法正常运行.如果将ODBC与FreeTDS一起使用,请确保在FreeTDS配置中配置TDS_VERSION 7.0到7.3,而不是4.2.

我还使用环境变量定义了TDS版本,但它没有解决问题...任何想法?

The*_*inn 4

在这里写了一个关于如何执行此操作的教程。本质上,您需要:

  1. brew install unixodbc
  2. brew install freetds --with-unixodbc
  3. 将 freetds 驱动程序添加到 odbcinst.ini
  4. 将 DSN(域源名称)添加到名为“MY_DSN”的 odbc.ini
  5. pip install pyodbc
  6. e = create_engine("mssql+pyodbc://username:password@MY_DSN")

此处的演练对此进行了更彻底的解释,包括 SQL Server/FreeTDS 协议版本兼容性问题。