使用 Python 通过 ODBC 或 JDBC 访问 IRIS 数据库

使用 python 通过 odbc 或 jdbc 访问 iris 数据库

字符串问题

我正在使用 python 通过 jdbc(或 odbc)访问 iris 数据库。 我想将数据提取到 pandas 数据框中来操作数据并从中创建图表。我在使用 jdbc 时遇到了字符串处理问题。这篇文章旨在帮助其他人遇到同样的问题。 或者,如果有更简单的方法来解决这个问题,请在评论中告诉我!

我使用的是 osx,所以我不确定我的问题有多独特。我正在使用 jupyter notebooks,尽管如果您使用任何其他 python 程序或框架,代码通常是相同的。

jdbc 问题

当我从数据库中获取数据时,列描述任何字符串数据都会作为数据类型java.lang.string返回。如果打印字符串数据,它将看起来像:“(p,a,i,n,i,n,t,h,e,r,e,a,r)”而不是预期的“painintherear”。

这可能是因为当使用 jdbc 获取时,数据类型 java.lang.string 的字符串作为可迭代对象或数组传入。 如果您使用的 python-java 桥接器(例如 jaydebeapi、jdbc)未一步自动将 java.lang.string 转换为 python str,则可能会发生这种情况。

立即学习“Python免费学习笔记(深入)”;

相比之下,python 的 str 字符串表示形式将整个字符串作为一个单元。 当 python 检索普通 str(例如通过 odbc)时,它不会拆分为单个字符。

jdbc 解决方案

要解决此问题,您必须确保 java.lang.string 正确转换为 python 的 str 类型。 您可以在处理获取的数据时显式处理此转换,因此它不会被解释为可迭代或字符列表。

有很多方法可以进行字符串操作;这就是我所做的。

import pandas as pdimport pyodbcimport jaydebeapiimport jpypedef my_function(jdbc_used)    # some other code to create the connection goes here    cursor.execute(query_string)    if jdbc_used:        # fetch the results, convert java.lang.string in the data to python str        # (java.lang.string is returned "(p,a,i,n,i,n,t,h,e,r,e,a,r)" convert to str type "painintherear"        results = []        for row in cursor.fetchall():            converted_row = [str(item) if isinstance(item, jpype.java.lang.string) else item for item in row]            results.append(converted_row)        # get the column names and ensure they are python strings         column_names = [str(col[0]) for col in cursor.description]        # create the dataframe        df = pd.dataframe.from_records(results, columns=column_names)        # check the results        print(df.head().to_string())    else:          # i was also testing odbc        # for very large result sets get results in chunks using cursor.fetchmany(). or fetchall()        results = cursor.fetchall()        # get the column names        column_names = [column[0] for column in cursor.description]        # create the dataframe        df = pd.dataframe.from_records(results, columns=column_names)    # do stuff with your dataframe

odbc 问题

使用 odbc 连接时,不会返回字符串或不返回字符串。

如果您要连接到包含 unicode 数据(例如,不同语言的名称)的数据库,或者您的应用程序需要存储或检索非 ascii 字符,则必须确保数据在数据库之间传递时保持正确编码。数据库和您的 python 应用程序。

odbc 解决方案

此代码确保在向数据库发送和检索数据时,使用 utf-8 对字符串数据进行编码和解码。 在处理非 ascii 字符或确保与 unicode 数据的兼容性时,这一点尤其重要。

def create_connection(connection_string, password):    connection = none    try:        # print(f"connecting to {connection_string}")        connection = pyodbc.connect(connection_string + ";pwd=" + password)        # ensure strings are read correctly        connection.setdecoding(pyodbc.sql_char, encoding="utf8")        connection.setdecoding(pyodbc.sql_wchar, encoding="utf8")        connection.setencoding(encoding="utf8")    except pyodbc.error as e:        print(f"the error '{e}' occurred")    return connection

connection.setdecoding(pyodbc.sql_char,encoding=”utf8″)

告诉 pyodbc 在获取 sql_char 类型(通常是固定长度字符字段)时如何从数据库中解码字符数据。

connection.setdecoding(pyodbc.sql_wchar,encoding=”utf8″)

设置 sql_wchar、宽字符类型(即 unicode 字符串,例如 sql server 中的 nvarchar 或 nchar)的解码。

connection.setencoding(encoding=”utf8″)

确保从 python 发送到数据库的任何字符串或字符数据都将使用 utf-8 进行编码,
这意味着python在与数据库通信时会将其内部str类型(即unicode)转换为utf-8字节。

把它们放在一起

安装 jdbc

安装java – 使用dmg

https://www.oracle.com/middleeast/java/technologies/downloads/#jdk23-mac

更新 shell 以设置默认版本

$ /usr/libexec/java_home -vmatching java virtual machines (2):    23 (arm64) "oracle corporation" - "java se 23" /library/java/javavirtualmachines/jdk-23.jdk/contents/home    1.8.421.09 (arm64) "oracle corporation" - "java" /library/internet plug-ins/javaappletplugin.plugin/contents/home/library/java/javavirtualmachines/jdk-23.jdk/contents/home$ echo $shell/opt/homebrew/bin/bash$ vi ~/.bash_profile

将 java_home 添加到您的路径

export java_home=$(/usr/libexec/java_home -v 23)export path=$java_home/bin:$path

获取 jdbc 驱动程序

https://intersystems-community.github.io/iris-driver-distribution/

将 jar 文件放在某个地方…我把它放在 $home

$ ls $home/*.jar/users/myname/intersystems-jdbc-3.8.4.jar

示例代码

它假设你已经设置了 odbc(另一天的例子,狗吃了我的笔记……)。

注意:这是对我的真实代码的修改。请注意变量名称。

import osimport datetimefrom datetime import date, time, datetime, timedeltaimport pandas as pdimport pyodbcimport jaydebeapiimport jpypedef jdbc_create_connection(jdbc_url, jdbc_username, jdbc_password):    # Path to JDBC driver    jdbc_driver_path = '/Users/yourname/intersystems-jdbc-3.8.4.jar'    # Ensure JAVA_HOME is set    os.environ['JAVA_HOME']='/Library/Java/JavaVirtualMachines/jdk-23.jdk/Contents/Home'    os.environ['CLASSPATH'] = jdbc_driver_path    # Start the JVM (if not already running)    if not jpype.isJVMStarted():        jpype.startJVM(jpype.getDefaultJVMPath(), classpath=[jdbc_driver_path])    # Connect to the database    connection = None    try:        connection = jaydebeapi.connect("com.intersystems.jdbc.IRISDriver",                                  jdbc_url,                                  [jdbc_username, jdbc_password],                                  jdbc_driver_path)        print("Connection successful")    except Exception as e:        print(f"An error occurred: {e}")    return connectiondef odbc_create_connection(connection_string):    connection = None    try:        # print(f"Connecting to {connection_string}")        connection = pyodbc.connect(connection_string)        # Ensure strings are read correctly        connection.setdecoding(pyodbc.SQL_CHAR, encoding="utf8")        connection.setdecoding(pyodbc.SQL_WCHAR, encoding="utf8")        connection.setencoding(encoding="utf8")    except pyodbc.Error as e:        print(f"The error '{e}' occurred")    return connection# Parametersodbc_driver = "InterSystems ODBC"odbc_host = "your_host"odbc_port = "51773"odbc_namespace = "your_namespace"odbc_username = "username"odbc_password = "password"jdbc_host = "your_host"jdbc_port = "51773"jdbc_namespace = "your_namespace"jdbc_username = "username"jdbc_password = "password"# Create connection and create chartsjdbc_used = Trueif jdbc_used:    print("Using JDBC")    jdbc_url = f"jdbc:IRIS://{jdbc_host}:{jdbc_port}/{jdbc_namespace}?useUnicode=true&characterEncoding=UTF-8"    connection = jdbc_create_connection(jdbc_url, jdbc_username, jdbc_password)else:    print("Using ODBC")    connection_string = f"Driver={odbc_driver};Host={odbc_host};Port={odbc_port};Database={odbc_namespace};UID={odbc_username};PWD={odbc_password}"    connection = odbc_create_connection(connection_string)if connection is None:    print("Unable to connect to IRIS")    exit()cursor = connection.cursor()site = "SAMPLE"table_name = "your.TableNAME"desired_columns = [    "RunDate",    "ActiveUsersCount",    "EpisodeCountEmergency",    "EpisodeCountInpatient",    "EpisodeCountOutpatient",    "EpisodeCountTotal",    "AppointmentCount",    "PrintCountTotal",    "site",]# Construct the column selection part of the querycolumn_selection = ", ".join(desired_columns)query_string = f"SELECT {column_selection} FROM {table_name} WHERE Site = '{site}'"print(query_string)cursor.execute(query_string)if jdbc_used:    # Fetch the results    results = []    for row in cursor.fetchall():        converted_row = [str(item) if isinstance(item, jpype.java.lang.String) else item for item in row]        results.append(converted_row)    # Get the column names and ensure they are Python strings (java.lang.String is returned "(p,a,i,n,i,n,t,h,e,a,r,s,e)"    column_names = [str(col[0]) for col in cursor.description]    # Create the dataframe    df = pd.DataFrame.from_records(results, columns=column_names)    print(df.head().to_string())else:    # For very large result sets get results in chunks using cursor.fetchmany(). or fetchall()    results = cursor.fetchall()    # Get the column names    column_names = [column[0] for column in cursor.description]    # Create the dataframe    df = pd.DataFrame.from_records(results, columns=column_names)    print(df.head().to_string())# # Build charts for a site# cf.build_7_day_rolling_average_chart(site, cursor, jdbc_used)cursor.close()connection.close()# Shutdown the JVM (if you started it)# jpype.shutdownJVM()

以上就是使用 Python 通过 ODBC 或 JDBC 访问 IRIS 数据库的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1350084.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 13:56:43
下一篇 2025年12月13日 13:56:51

相关推荐

  • 如何使用 Python 检索 Github 存储库数据

    您的组织是否拥有太多 github 存储库,并且您需要一种简单的方法来总结和记录每个存储库的内容以用于报告、仪表板或审计目的?下面是一个使用 github api 完成该操作的快速脚本。 功能: get_repo_info(所有者,回购): 获取 github 存储库所有者的用户名 (owner) …

    2025年12月13日
    000
  • PCEP 认证准备的 Python 元组和列表提示

    立志成为 python 认证入门级程序员 (pcep) 需要彻底了解 python 中的基本数据结构,例如列表和元组。 列表和元组都能够在 python 中存储对象,但这两种数据结构在用法和语法上存在关键差异。为了帮助您在 pcep 认证考试中取得好成绩,这里有一些掌握这些数据结构的基本技巧。 1。…

    2025年12月13日
    000
  • python可以抢演唱会的票吗

    是,Python 可以用于抢购演唱会门票。具体步骤如下:1. 在代码托管平台上寻找 Python 抢票脚本;2. 根据脚本说明进行配置,包括演出信息、售票平台 URL 和个人信息;3. 设置代理和头文件伪装请求;4. 在门票开售后运行脚本,脚本将自动执行抢票流程。 Python 可否抢购演唱会门票?…

    2025年12月13日
    000
  • python抢票功能介绍

    Python 抢票功能可以通过自动化抢票流程提高抢票成功率。其关键特性包括:1. 自动监控票务信息;2. 快速提交订单;3. 多线程抢票;4. 自动填充信息。实现方式主要采用 Selenium 和 Requests 库,并使用多线程。适用场景主要包括春运抢火车票、演唱会门票抢购和特殊车次抢票。需要注…

    2025年12月13日
    000
  • python自动抢火车票教程

    Python 自动抢火车票教程:安装 requests 和 BeautifulSoup4 库。获取火车信息,包括车次、出发/到达站、日期等。根据需求筛选候选车次,如有剩余车票。构造请求头,模拟浏览器发送请求。使用多线程或多进程并发抢票,增加成功率。 Python 自动抢火车票教程 一、安装必要的库 …

    2025年12月13日
    000
  • python源代码如何导出

    导出 Python 源代码包括两种方法:使用内置的 help() 函数打印模块源代码。安装 astunparse 库并使用 unparse() 函数导出源代码。 如何导出 Python 源代码 导出 Python 源代码是将代码从运行环境中提取并存储为文本文件的过程。这对于共享、存档或调试代码非常有…

    2025年12月13日
    000
  • python模拟编程软件

    Python 模拟编程软件是使用 Python 语言编写的软件,用于模拟真实世界的系统、流程和现象,具有快速原型设计、易于扩展、跨平台兼容性、大数据处理和可视化等优点,应用于系统建模、物理现象、生物模型、经济模拟和游戏开发等领域。选择 Python 模拟编程软件时,需要考虑建模目标、易用性、性能、社…

    2025年12月13日
    000
  • 用python模拟火车订票系统

    使用 Python 模拟火车订票系统的方法包括:数据建模:创建 Passenger、Train、Trip 和 Booking 类。数据库连接:使用 SQLAlchemy 连接到数据库。ORM:使用 SQLAlchemy ORM 将数据模型映射到数据库表。用户界面:创建命令行或 GUI 界面以与用户交…

    2025年12月13日
    000
  • python抢票程序怎么写

    该指南提供了编写 Python 抢票程序的步骤:安装依赖库:pip install requests获取指定车次的余票信息:解析余票信息:使用正则表达式匹配余票信息循环查询并抢票:不断查询余票情况,发现余票后立即发送抢票请求 Python 抢票程序编写指南 第一步:安装依赖库 pip install…

    2025年12月13日
    000
  • python抢票脚本视频教程

    Python抢票脚本可有效提高抢票成功率,因为它能自动执行购票流程。视频教程内容包括:1. Python基础知识;2. 抢票网站分析和验证码识别;3. 抢票脚本编写;4. 脚本部署与使用;5. 实战案例。该教程直观易懂,实时演示,循序渐进,涵盖抢票技巧,提升成功率。 Python抢票脚本视频教程 一…

    2025年12月13日
    000
  • python微信抢票脚本

    微信抢票脚本的作用是通过模拟微信登录、查询余票、提交订单等操作,实现快速、准确地抢购火车票,其优势在于速度快、准确性高、省时省力。使用时请确保使用最新版本软件、使用真实微信账号、遵守购票规定,并定期更新脚本以适应系统变化。 Python 微信抢票脚本 抢票脚本的作用 微信抢票脚本是一个利用 Pyth…

    2025年12月13日
    000
  • python爬虫零基础教程

    网络爬虫是自动化工具,用于从互联网提取数据,Python 因其易学性、丰富库和可扩展性,是进行网络爬虫的理想语言。基础爬虫的构建步骤包括:导入库、发送请求、解析 HTML、提取数据。高级技巧包括:处理 JavaScript、多线程、遵守机器人协议。通过掌握这些技巧,Python 爬虫能够有效地提取有…

    2025年12月13日
    000
  • python实战项目火车票

    火车票预订系统可实现乘客登录、查询时刻表、预订、查看预订、退票等功能。系统使用字典存储乘客信息,列表存储列车时刻表和预订记录。函数定义用于处理不同操作,遵循输入-处理-输出结构。流程图示出乘客登录/注册、查询、预订、查看记录、退票等步骤,示例代码提供了部分具体实现。 Python 实战项目:火车票预…

    2025年12月13日
    000
  • python自动抢购编程

    如何使用 Python 自动抢购:获取商品信息,如 URL、名称和库存;建立代理 IP 池,防止被检测为机器人;在商品库存开放时向网站发出抢购请求;处理抢购结果,判断抢购是否成功并采取相应动作。 Python 自动抢购编程 抢购限量版商品或热门产品是一项需要快速反应和精密的活动。随着电子商务的兴起,…

    2025年12月13日
    000
  • 使用python爬取火车票情况

    通过以下步骤使用 Python 爬取火车票情况:使用 requests 库获取火车票信息。使用 BeautifulSoup 解析 HTML 响应提取火车票信息。从解析后的 HTML 中提取所需信息,如出发地、目的地、时间、票价等。将爬取到的火车票信息存储到数据库、文件或展示在控制台中。 使用 Pyt…

    2025年12月13日
    000
  • python编程入门自学软件

    初学者适合使用入门级软件,如 IDLE、PyCharm Community 或 Thonny。进阶学习者可选择功能强大的软件,如 Visual Studio Code、PyDev 或 Sublime Text。其他辅助软件包括 Jupyter Notebook、Spyder 和 Pygame。软件选…

    2025年12月13日
    000
  • python自学免费教程

    免费的 Python 自学教程:1. Coursera 提供 Python 入门、数据科学和机器学习课程;2. edX 涵盖 Python 基础、数据分析和机器学习主题;3. Udemy 提供免费的 Python 基础语法、数据类型和函数课程;4. YouTube 提供各种主题的 Python 教程…

    2025年12月13日
    000
  • 理解 Python 中的关键字参数

    当您使用 python 编程时,了解如何向函数传递参数是编写清晰、灵活且易于维护的代码的关键。 python 提供的一项强大功能是使用关键字参数。这些使您能够以简洁、可读且可自定义的方式调用函数。 本文将解释什么是关键字参数、如何使用它们、它们的好处、实际示例和高级功能。 什么是关键字参数? 在 p…

    2025年12月13日
    000
  • 招聘 Django 开发人员

    大家好,我是 Nicholas,一名软件开发人员,在构建强大的 Web 应用程序方面拥有 3 年经验,利用 Python、JavaScript 和 Ruby 提供使用最新行业技术(例如 Django、Nodejs、Nextjs、 Reactstrap、Ruby on Rails、Git 和 Redi…

    2025年12月13日
    000
  • 编写干净、高效且可维护的代码 - Python 作为用例

    编写干净、高效且可维护的代码 - python 作为用例。如果您已经成为开发人员一段时间,您可能会理解正确编码的重要性,而不是急于编写有效的东西。这对您来说最大的挫折之一是,当您需要检查代码时,您很少能理解您想要做什么,而对于其他人来说,他们很难阅读您的代码。  我最近一直在审查一些代码,我认为强调…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信