关键字:PyODBC,unixODBC,IRIS,IntegratedML,Jupyter Notebook,Python 3

目的

几个月前,我简单谈到了关于“将 Python JDBC 连接到 IRIS”的话题。我后来频繁提起它, 因此决定再写一篇 5 分钟的笔记,说明如何“将 Python ODBC 连接到 IRIS”。

在 Windows 客户端中通常很容易设置 ODBC 和 PyODBC,不过我每次在 Linux/Unix 风格的服务器中设置 unixODBC 和 PyODBC 客户端时,都会遇到一些麻烦。

有没有一种简单连贯的方法,可以不安装任何 IRIS,在原版 Linux 客户端中让 PyODBC/unixODBC 针对远程 IRIS 服务器运行?

范围

最近,我花了点时间研究如何在 Linux Docker 环境的 Jupyter Notebook 中从头开始让一个 PyODBC 演示运行起来, 记录下这篇稍微有些繁琐的笔记,以供日后快速参考。

范围内

这篇笔记将涉及以下组件:

  • PyODBC over unixODBC 
  • 安装了 TensorFlow 2.2 和 Python 3 的 Jupyter Notebook 服务器
  • 带有 IntegratedML 的 IRIS2020.3 CE 服务器,包括示例测试数据。
  • 在此环境中

  • 安装了 Docker-compose over AWS Ubuntu 16.04 的 Docker Engine
  • Docker Desktop for MacOSDocker Toolbox for Windows 10 也经过了测试
  • 范围外

    同样,在此演示环境中不评估非功能性方面。 它们很重要,并且可以针对特定站点,如:

  • 端到端安全和审核
  • 性能和可扩展性
  • 许可和可支持性等
  • 环境

    任何原版 Linux Docker 镜像都可以用于以下配置和测试步骤,但有一个简单的方法可以在 5 分钟内设置这样的环境:

    1. Git 克隆此演示模板克隆
    2. 在包含 docker-compose.yml 文件的克隆目录中运行“docker-compose up -d”。

    这将创建一个演示环境,如下面的拓扑所示,其中包含 2 个容器。 一个用于 Jupyter Notebook 服务器作为 PyODBC 客户端,另一个用于 IRIS2020.3 CE 服务器。

    在上面的环境中,tf2jupyter 仅包含“Python over JDBC”客户端配置;它尚不包含任何 ODBC 或 PyODBC 客户端配置。

    因此,我们将直接在 Jupyter Notebook 内部运行以下设置步骤,以使其易于说明。

    步骤

    以下配置和测试由我在 AWS Ubuntu 16.04 服务器中运行, 由我的同事 @Thomas Dyar 在 MacOS 中运行。 另外在 Docker Toolbox for Windows 中也进行了简单的测试。 不过,如果您遇到任何问题,还是请告诉我们。运行。 另外在 Docker Toolbox for Windows 中也进行了简单的测试。 不过,如果您遇到任何问题,还是请告诉我们。

    以下步骤可以自动化到其 Dockerfile。 我在这里特别记录一下,以防几个月后忘记。

    1. 官方文档:

  • IRIS 的 ODBC 支持
  • 在 Unix 上定义 ODBC 数据源
  • IRIS 的 PyODBC 支持
  • 2. 连接到 Jupyter 服务器

    我用本地 Putty 的 SSH 隧道连接到远程 AWS Ubuntu 端口 22,然后按照上述拓扑结构映射到端口 8896。

    (举个例子,在本地 Docker 环境中,也可以直接直接 http 到 Docker 机器的 IP:8896。)

    3. 从 Jupyter Notebook 中运行 ODBC 安装

    直接在 Jupyter 单元格中运行以下代码:

    !apt-get update<br>!apt-get install gcc<br>!apt-get install -y tdsodbc unixodbc-dev<br>!apt install unixodbc-bin -y<br>!apt-get clean -y

    它将安装 gcc(包括 g++)编译器、FreeTDS、unixODBC 和 unixodbc-dev,以在下一步重新编译 PyODBC 驱动程序。

    在原生 Windows 服务器或 PC 上安装 PyODBC 不需要这一步。

    4. 从 Jupyter 中运行 PyODBC 安装

    !pip install pyodbc
    Collecting pyodbcDownloading pyodbc-4.0.30.tar.gz (266 kB)|████████████████████████████████| 266 kB 11.3 MB/s eta 0:00:01
    Building wheels for collected packages: pyodbcBuilding wheel for pyodbc (setup.py) ... doneCreated wheel for pyodbc: filename=pyodbc-4.0.30-cp36-cp36m-linux_x86_64.whl size=273453 sha256=b794c35f41e440441f2e79a95fead36d3aebfa74c0832a92647bb90c934688b3Stored in directory: /root/.cache/pip/wheels/e3/3f/16/e11367542166d4f8a252c031ac3a4163d3b901b251ec71e905
    Successfully built pyodbc
    Installing collected packages: pyodbc
    Successfully installed pyodbc-4.0.30

    以上是这个 Docker 演示的最简化 pip 安装。 在官方文档中,为“MacOS X 安装”提供了更详细的 pip 安装。

    5 在 Linux 中重新配置 ODBC INI 文件和链接:

    运行以下命令重新创建 odbcinst.iniodbc.ini 链接

    !rm /etc/odbcinst.ini
    !rm /etc/odbc.ini
    !ln -s /tf/odbcinst.ini /etc/odbcinst.ini
    !ln -s /tf/odbc.ini /etc/odbc.ini

    注:这样的原因是,第 3 步和第 4 步通常会在 \etc\ directory 下创建 2 个空白(因此无效)的 ODBC 文件。与 Windows 安装不同,这里的空白 ini 文件会导致问题。因此需要先将其删除,然后重新创建一个链接来指向映射的 Docker 卷中提供的真实 ini 文件:/tf/odbcinst.ini 和 /tf/odbc.ini

    看一看这两个 ini 文件。在这种情况下,它们是 Linux ODBC 配置的最简形式:

    !cat /tf/odbcinst.ini
    [InterSystems ODBC35]
    UsageCount=1
    Driver=/tf/libirisodbcu35.so
    Setup=/tf/libirisodbcu35.so
    SQLLevel=1
    FileUsage=0
    DriverODBCVer=02.10
    ConnectFunctions=YYN
    APILevel=1
    DEBUG=1
    CPTimeout=<not pooled>
    !cat /tf/odbc.ini
    [IRIS PyODBC Demo]
    Driver=InterSystems ODBC35
    Protocol=TCP
    Host=irisimlsvr
    Port=51773
    Namespace=USER
    UID=SUPERUSER
    Password=SYS
    Description=Sample namespace
    Query Timeout=0
    Static Cursors=0

    以上文件都已预先配置,位于映射的驱动器中。 引用的是驱动程序文件 libirisodbcu35.so,可以从 IRIS 服务器的容器实例中获取该文件(在其 {iris-installation}/bin 目录下)。

    要使上述 ODBC 安装正常运行,这 3 个文件必须存在于具有正确文件权限的映射驱动器(或任何 Linux 驱动器)中:

  • libirisodbcu35.so
  • odbcinst.ini
  • odbc.ini
  • 6. 验证 PyODBC 安装 

    !odbcinst -j
    unixODBC 2.3.4
    DRIVERS............: /etc/odbcinst.ini
    SYSTEM DATA SOURCES: /etc/odbc.ini
    FILE DATA SOURCES..: /etc/ODBCDataSources
    USER DATA SOURCES..: /root/.odbc.ini
    SQLULEN Size.......: 8
    SQLLEN Size........: 8
    SQLSETPOSIROW Size.: 8
    import pyodbc
    print(pyodbc.drivers())
    ['InterSystems ODBC35']

    以上输出将表明 ODBC 驱动程序目前具有有效链接。

    我们应该能够在 Jupyter Notebook 中运行一些 Python ODBC 测试

    7. 运行将 Python ODBC 连接到 IRIS 的示例:

    import pyodbc 
    import time
    ### 1. Get an ODBC connection 
    #input("Hit any key to start")
    dsn = ' IRIS PyODBC Demo'
    server = ' irisimlsvr'   # IRIS server container or the docker machine's IP 
    port = '51773'   # or 8091 if docker machine IP is used
    database = 'USER' 
    username = 'SUPERUSER' 
    password = 'SYS' 
    #cnxn = pyodbc.connect('DSN='+dsn+';')   # use the user DSN defined in odbc.ini, or use the connection string below cnxn = pyodbc.connect('DRIVER={InterSystems ODBC35};SERVER='+server+';PORT='+port+';DATABASE='+database+';UID='+username+';PWD='+ password)
    ###ensure it reads strings correctly.
    cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf8')
    cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf8')
    cnxn.setencoding(encoding='utf8')
    ### 2. Get a cursor; start the timer
    cursor = cnxn.cursor()
    start= time.clock()
    ### 3. specify the training data, and give a model name
    dataTable = 'DataMining.IrisDataset'
    dataTablePredict = 'Result12'
    dataColumn =  'Species'
    dataColumnPredict = "PredictedSpecies"
    modelName = "Flower12" #chose a name - must be unique in server end
    ### 4. Train and predict
    #cursor.execute("CREATE MODEL %s PREDICTING (%s)  FROM %s" % (modelName, dataColumn, dataTable))
    #cursor.execute("TRAIN MODEL %s FROM %s" % (modelName, dataTable))
    #cursor.execute("Create Table %s (%s VARCHAR(100), %s VARCHAR(100))" % (dataTablePredict, dataColumnPredict, dataColumn))
    #cursor.execute("INSERT INTO %s  SELECT TOP 20 PREDICT(%s) AS %s, %s FROM %s" % (dataTablePredict, modelName, dataColumnPredict, dataColumn, dataTable)) 
    #cnxn.commit()
    ### 5. show the predict result
    cursor.execute("SELECT * from %s ORDER BY ID" % dataTable)   #or use dataTablePredict result by IntegratedML if you run step 4 above
    row = cursor.fetchone() 
    while row: 
        print(row) 
        row = cursor.fetchone()
    ### 6. CLose and clean     
    cnxn.close()
    end= time.clock()
    print ("Total elapsed time: ")
    print (end-start)
    (1, 1.4, 0.2, 5.1, 3.5, 'Iris-setosa')
    (2, 1.4, 0.2, 4.9, 3.0, 'Iris-setosa')
    (3, 1.3, 0.2, 4.7, 3.2, 'Iris-setosa')
    (4, 1.5, 0.2, 4.6, 3.1, 'Iris-setosa')
    (5, 1.4, 0.2, 5.0, 3.6, 'Iris-setosa')
    ... ...
    ... ...
    ... ...
    (146, 5.2, 2.3, 6.7, 3.0, 'Iris-virginica')
    (147, 5.0, 1.9, 6.3, 2.5, 'Iris-virginica')
    (148, 5.2, 2.0, 6.5, 3.0, 'Iris-virginica')
    (149, 5.4, 2.3, 6.2, 3.4, 'Iris-virginica')
    (150, 5.1, 1.8, 5.9, 3.0, 'Iris-virginica')
    Total elapsed time:
    0.023873000000000033

    这里有一些陷阱:

    1. cnxn = pyodbc.connect() - 在 Linux 环境下,此调用中传递的连接字符串必须正确无误,不能有任何空格。
    2. 正确设置连接编码,例如使用 utf8。  在这里默认值对字符串不起作用。
    3. libirisodbcu35.so - 理想情况下,此驱动程序文件应与远程 IRIS 服务器的版本保持一致。

    未来计划 

    这样就得到一个带有 Jupyter Notebook 的 Docker 环境,包括 Python3 和 TensorFlow 2.2(无 GPU),通过 PyODBC(以及 JDBC)连接到远程 IRIS 服务器。 所有定制的 SQL 语法应该都可以适用,比如 IRIS Integrated ML 专有的 SQL 语法。那么何不多研究一下 IntegratedML 的功能,用它驱动 ML 生命周期的 SQL 方法以进行一些创新?

    另外,我希望接下来能介绍或总结出在 IRIS Native 甚至是 Python 环境中的魔法 SQL 上最简单的 IRIS 服务器挂接方法。 而且,现在有出色的 Python Gateway,我们甚至可以直接从 IRIS 服务器内部调用外部 Python ML 应用和服务。我希望我们也能在这方面多做些尝试。

    附录

    上面的笔记本文件也将被迁入此 Github 存储库以及 Open Exchange 中。

将 Python ODBC 连接到 IRIS 数据库 - 第 2 条快速笔记相关推荐

  1. mysql数据库连接地址utf8_在Python中连接到MySQL数据库时UTF8不工作

    我正在努力使Python更好地使用UTF-8编码的MySQL数据库,例如,挪威字符æøå.我找了好几个小时,但没能找到像预期的那样有效的东西.以下是从数据库中提取的示例表:mysql> sele ...

  2. 使用Excel 通过 ODBC 连接到 MySQL 数据库

    MySQL官方提供了MySQL Connector/ODBC下载,我们只需要下载安装就能让windows支持了.请下载与您Office相同架构的驱动.如果您不确定您的office是32位还是64位,您 ...

  3. python连接到SQList数据库以及简单操作

    python连接到SQList数据库以及简单操作 背景了解: Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用.Python定义了一套操作数据库 ...

  4. python通过什么连接数据库_Python-如何使用Python连接到MySQL数据库?

    小编典典 分三步使用Python 2连接到MYSQL 1-设定 在执行任何操作之前,必须安装MySQL驱动程序.与PHP不同,默认情况下,Python仅安装SQLite驱动程序.最常用的软件包是MyS ...

  5. python只能使用内置数据库_隐藏彩蛋:你知道python有一个内置的数据库吗?

    本文转载自公众号"读芯术"(ID:AI_Discovery). 如果你是软件开发人员,相信你一定知道甚至曾经使用过一个非常轻量级的数据库--SQLite.它几乎拥有作为一个关系数据 ...

  6. python psycopg2使用_python 操作数据库:psycopg2的使用

    1 conn = psycopg2.connect(database="testdb", user="postgres", password="coh ...

  7. python连接access数据库odbc_对Python通过pypyodbc访问Access数据库的方法详解

    看书上通过ODBC访问数据库的案例,想实践一下在Python 3.6.1中实现access2003数据库的链接,但是在导入odbc模块的时候出现了问题,后来查了一些资料就尝试着使用pypyodbc,最 ...

  8. python标准数据库接口是_Python 数据库接口模块_python 数据库模块_python 数据库接口...

    本条目收集了 Python 中的常用数据库接口模块,包括各种主流关系数据库和一些通用接口 如无特别注明,均实现(或部分实现)了 DB-API 标准. 更广泛的 Python 数据库技术参见 Pytho ...

  9. 使用DBeaver连接IRIS数据库

    在Caché时代, 比较受欢迎的IRIS数据库客户端是Sqldbx和Winsql, 这两者的共同点是提供ODBC兼容的连接,而且免费.限制也差不多:只能用于Windows环境,只能用ODBC连接. D ...

最新文章

  1. Feflow 源码解读
  2. 避免让网站沦为摆设,从三个方面着手塑造!
  3. js 连接mysql_搭建node服务(二):操作MySQL
  4. 稍等片刻 正在提取文件_电脑文件误删除并且清空了回收站,怎么恢复文件?教你一招!...
  5. Delphi中的容器类(3)
  6. DDD理论学习系列(4)-- 领域模型
  7. redmine更换主题
  8. 移动端iphone抓包调试神器—Stream安装和使用(一)
  9. 这就是即将发布的苹果刘海屏MacBook Pro样机?
  10. 双核CPU揭密:英特尔/AMD没有告诉你的五项事实【ZZ】
  11. 自学前端,需要学习哪些知识点?学多久可以入职前端工程师?
  12. 谁说国产编译器没救了?这个 C/C++ 和 JavaScript 编译器来了 | 程序人生 2020
  13. php 复杂数组排序,如何利用php array_multisort函数 对数据库结果进行复杂排序
  14. [2010-8-22]
  15. 苹果cms模板_我的主题网【第二十五套】精简宽屏大气苹果CMSv10模板DIY系列拆分版...
  16. 与其纠结,不如放弃!
  17. [引]构造文法时表达式中算符优先级的问题
  18. Pandas高级教程之:时间处理
  19. 二进制安装PLG日志服务
  20. 办流量卡要身份证照片,办流量卡是否需要身份证正反面照片

热门文章

  1. 数据恢复笔记——NTFS文件系统
  2. ELK日志分析系统及相关
  3. iPhoto的删除动画(转)
  4. HTML编写超链接按钮,要求按钮有立体感
  5. java处理日期的类_Java实现的日期处理类完整实例
  6. 批处理学习教程(3)------if的用法
  7. 索尼手机c6802的Android,索尼C6802 (Xperia UL)ROOT教程,简单几步完成ROOT
  8. mysql declare 用法,MySQL5新语句declare的用法
  9. 所有计算机专业考研都变了!西安邮电大学计算机考研改考
  10. 学校私有云盘(私有云存储)解决方案!