【问题标题】:Querying MSSQL server 2012 from a Raspberry Pi 3 using Python, FreeTDS and pyodbc使用 Python、FreeTDS 和 pyodbc 从 Raspberry Pi 3 查询 MSSQL server 2012
【发布时间】:2017-12-11 16:50:20
【问题描述】:

我正在尝试使用 Python 作为我在树莓派 Pi3 上的脚本语言来查询 MSSQL Server 2012。

我需要创建一个应用程序来查询 MSSQL 服务器并返回一些需要在 H.M.I. 上显示的值。我选择了树莓派平台,使用 Python 作为编程语言来开发这个解决方案。我在 Windows 7 PC 上使用 PyCharm 创建了脚本,一切运行良好。当我将它移到 Raspberry 平台时,它不起作用。

我正在使用 pyODBC 进行连接和查询,并使用 FreeTDS 作为驱动程序。我使用以下过程进行设置:

 sudo apt-get install freetds-dev freetds-bin unixodbc-dev tdsodbc
 pip3 install pyODBC

配置/etc/freetds.conf文件如下

 [NAME]
 host = ipAddress
 port = 1433
 tds version = 7.4
 instance = dbInstanceName

然后我转到命令行并测试连接:tsql -S NAME -U username。然后命令行提示Password:,所以我输入了密码,我得到了以下信息:

 locale is "enGB.UTF-8"
 locale charset is "UTF-8"
 using default charset "UTF-8"
 1>

由于没有错误,我只能假设这有效?

然后我如下设置 /etc/odbcinst.ini 文件:

 [FreeTDS]
 Driver = /usr/lib/arm-linux-gnueabihf/odbc/libtdsodbc.so

然后我如下设置 /etc/odbc.ini 文件:

 [NAME1]
 Driver = /usr/lib/arm-linux-gnueabihf/odbc/libtdsodbc.so
 Description = MSSQL Server
 Trace = No
 Server = ipAddress
 Database = dbName
 Port = 1433
 TDS_Version = 7.4

然后我在命令行中使用 isql 函数对此进行了测试:isql NAME1 user password 并得到以下提示:

+-------------------------------------------------+
| Connected!
|
| sql-statement
| help [tablename] 
| quit
|
+-------------------------------------------------+

SQL> 

所以我输入了select getDate() 并返回了日期和时间。

但是在 Python 中我仍然无法建立连接,我在解释器中输入了以下内容:

import pyodbc

conn = pyodbc.connect('DRIVER=FreeTDS;SERVER=NAME;DATABASE=dbName;UID=user;PWD=password')

然后当我输入 cu = conn.cursor() 时,我得到一个错误:

AttributeError: 'NoneType' object has no attribute cursor

【问题讨论】:

  • 您是否为连接成功设置了 NAME、dbName、用户和密码值?提示:gist.github.com/rduplain/1293636#file-hello_pyodbc-py
  • 另外请注意,connect函数获取单个字符串作为参数。
  • 您好 BoboDarph,谢谢您的回复,我确实将用户名和密码设置为真实值。

标签: python sql-server raspberry-pi pyodbc freetds


【解决方案1】:

在带有 Raspbian 和 MS Sql server 2008 的 Raspberry pi2 和 Python 3 上测试

确保您的 APT-Get 库和 Python 版本是最新的”

sudo apt-get dist-upgrade
Sudo apt-get install python3

运行以下命令来安装需求

sudo apt-get install unixodbc
sudo apt-get install unixodbc-dev
sudo apt-get install freetds-dev
sudo apt-get install tdsodbc
sudo apt-get install freetds-bin 

在终端中,现在运行 :(使用 'pip3' 因为 pyodbc 不会为 pip (python 2) 安装由于一些错误)

sudo pip3 install pyodbc
sudo apt-get install python-pyodbc

像这样更改 freeTDS.conf

sudo nano /etc/freetds/freetds.conf

Add a block like this :

[sqlserver]
      host = 182.172.2.2    # Remote Sql Server's IP addr
      port = 1433           # this is default
      tds version = 7.0     # this is by the time i post this
      instance = Test1      # your Database name 

然后设置/etc/odbcinst.ini文件如下:

[FreeTDS]
Description = FreeTDS unixODBC Driver
Driver = /usr/lib/arm-linux-gnueabihf/odbc/libtdsodbc.so
Setup = /usr/lib/arm-linux-gnueabihf/odbc/libtdsodbc.so
UsageCount = 1

然后设置 /etc/odbc.ini 文件如下:

[NAME1]
Driver = /usr/lib/arm-linux-gnueabihf/odbc/libtdsodbc.so
Description = MSSQL Server
Trace = No
Server = Server2      # IP or host name of the Sql Server
Database = Test1      # DataBase Name
Port = 1433           # This is default
TDS_Version = 7.4

现在用这个命令测试连接(第二个你应该可以通过命令行访问 Sql server

tsql -S sqlserver -U username
isql NAME1 user 'password'

最后是代码部分:

import pyodbc
conn = pyodbc.connect('DRIVER={FreeTDS};Server=Server2;PORT=1433;DATABASE=Test1;UID=user;PWD=pass;TDS_Version=7.2;')
cursor = conn.cursor()
cursor.execute("Select * from Table1")
for row in cursor.fetchall():
    print (row)

最后,如果没有任何效果,试试这个:

sudo dpkg-reconfigure tdsodbc

【讨论】:

    【解决方案2】:

    我会尝试将 RPi 3 连接到我在 SQL Server 中的数据库,以捕获 GPIO 状态/值。

    我已经用了一个叫Webiopi的web服务器,python用来执行宏,定义GPIO函数/值。

    有可能吗?

    If(possible == yes)
      {
         happiness = happiness + 10;
         return view(success)
      }
    else
      {
         happines = 0;
         return view(keep_searching);
      }
    

    TY

    【讨论】:

      【解决方案3】:

      问题在于您的连接字符串。这是 FreeTDS 的完整连接字符串示例:

      conn = pyodbc.connect(
          'DRIVER={FreeTDS};SERVER=yourfqdn.com;PORT=1433;DATABASE=your_db;UID=your_username;PWD=your_pw;TDS_Version=7.4;'
      )
      

      尝试将{FreeTDS} 放在大括号中并明确添加TDS_Version。我还选择在我的 Python 连接字符串中使用 FQDN,并将用户名/密码设置为环境变量,以将配置保存在一个更少的位置。

      【讨论】:

      • 嗨 FlipperPA,谢谢您的回复。我现在已将连接字符串更改为 'DRIVER={FreeTDS};SERVER=ipAddress;PORT=1433;DATABASE=dbName;UID=user;PWD=password;TDS_Version=7.4;'但不幸的是它仍然无法连接!
      • 我打赌你没有 FreeTDS 1.0,它是第一个支持 TDS_Version=7.4 的。你可以试试TDS_Version=7.1,如果可行,试试7.2和7.3?如果您让我知道您正在运行的 FreeTDS 版本(tsql -C),我可以确定支持的最大 TDS 版本是多少。
      • 嗨 FlipperPA,谢谢您的回复。你说得对,我安装了 0.91 版。还有另一行显示 TDS 版本 4.2
      • 另一件事我有明确声明为 SERVER=192.168.4.212 的 ipAdress 是否需要用大括号括起来?
      • 只有DRIVER={Driver} 需要放在大括号中。版本 0.91 支持的最大 TDS_Version7.2。我有一个 PR,但是文档还没有更新:github.com/FreeTDS/freetds/pull/71/filesTDS Version 4.2 来自freetds.conf 中的[global] 设置。在pyodbc.connect() 字符串中传递TDS_Version=7.2 应该覆盖它。
      猜你喜欢
      • 2019-04-24
      • 2014-08-09
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 2021-11-14
      • 2017-01-01
      相关资源
      最近更新 更多