Python连接达梦数据库并实现简单查询的完整指南

达梦数据库(DM Database)是中国自主研发的高性能关系型数据库系统,广泛应用于金融、政务、能源等关键行业。随着国产化替代的推进,越来越多开发者需要掌握如何在Python中连接和操作达梦数据库。本文将详细介绍使用Python连接达梦数据库的完整流程,并通过代码示例演示如何执行简单查询。


一、环境准备

1. 安装达梦数据库

首先需在服务器或本地部署达梦数据库实例。可以从达梦官网下载安装包,并根据操作系统选择对应的版本(如Linux或Windows)。安装完成后,确保数据库服务已启动。

2. 安装Python依赖库

达梦数据库官方提供了dmPython库,支持Python 3.x版本。通过以下命令安装:

pip install dmPython

注意:安装前需确保系统已安装达梦数据库的客户端驱动(libDmPython.sodmPython.dll),并配置环境变量(如LD_LIBRARY_PATH)。


二、连接达梦数据库

1. 连接参数说明

连接达梦数据库需要以下关键参数:

  • Host:数据库服务器IP地址。
  • Port:数据库监听端口(默认5236)。
  • Service Name:服务名(如DAMENG)。
  • Username:数据库用户名(如SYSDBA)。
  • Password:对应用户的密码。

2. 连接示例代码

import dmPython

# 连接达梦数据库
def connect_dm():
    try:
        conn = dmPython.connect(
            host='127.0.0.1',       # 数据库地址
            port=5236,              # 默认端口
            user='SYSDBA',          # 系统管理员账号
            password='SYSDBA',      # 初始密码
            service_name='DAMENG'   # 服务名
        )
        print("✅ 成功连接达梦数据库")
        return conn
    except Exception as e:
        print(f"❌ 连接失败: {e}")
        return None

三、执行简单查询

1. 查询单表数据

以查询系统自带的DMHR.EMPLOYEE表为例,演示如何获取结果集。

def query_data(conn):
    try:
        cursor = conn.cursor()  # 创建游标
        sql = "SELECT EMPLOYEE_ID, NAME, SALARY FROM DMHR.EMPLOYEE WHERE SALARY > 10000"
        cursor.execute(sql)     # 执行SQL
        
        # 获取所有结果
        results = cursor.fetchall()
        for row in results:
            print(f"员工ID: {row[0]}, 姓名: {row[1]}, 工资: {row[2]}")
        
        cursor.close()
        conn.close()
    except Exception as e:
        print(f"❌ 查询失败: {e}")
        conn.rollback()  # 回滚事务

2. 参数化查询

为防止SQL注入,推荐使用参数化查询方式:

def parameterized_query(conn, salary_threshold):
    try:
        cursor = conn.cursor()
        sql = "SELECT NAME, SALARY FROM DMHR.EMPLOYEE WHERE SALARY > ?"
        cursor.execute(sql, (salary_threshold,))  # 传入参数
        results = cursor.fetchall()
        for name, salary in results:
            print(f"姓名: {name}, 工资: {salary}")
        cursor.close()
    except Exception as e:
        print(f"❌ 参数化查询失败: {e}")

四、完整示例代码

import dmPython

def main():
    # 连接数据库
    conn = connect_dm()
    if not conn:
        return

    # 查询数据
    query_data(conn)

    # 参数化查询示例
    parameterized_query(conn, 15000)

if __name__ == "__main__":
    main()

五、常见问题与解决方案

1. 连接失败

  • 错误代码: dmPython.DatabaseError: can't connect to database
  • 解决方法
    • 检查数据库服务是否启动(dmserver进程是否存在)。
    • 验证防火墙是否开放5236端口。
    • 确认用户名和密码是否正确(默认SYSDBA/SYSDBA)。

2. 驱动缺失

  • 错误提示: libDmPython.so: cannot open shared object file
  • 解决方法
    • 将达梦客户端的lib目录添加到系统路径:
      export LD_LIBRARY_PATH=/opt/dm8/lib:$LD_LIBRARY_PATH
      

3. 查询结果为空

  • 可能原因
    • 目标表中无符合条件的数据。
    • 权限不足(需授予SELECT权限):
      GRANT SELECT ON DMHR.EMPLOYEE TO SYSDBA;
      

六、性能优化建议

1. 使用连接池

频繁创建和关闭连接会消耗资源。可通过dmPython的连接池功能优化:

from dmPython import ConnectionPool

pool = ConnectionPool(mincached=2, maxcached=10)
conn = pool.getconn()  # 从池中获取连接

2. 批量插入/更新

对于大量数据操作,使用executemany()方法提升效率:

data = [(f"John{i}", 20000) for i in range(100)]
cursor.executemany("INSERT INTO TEST(NAME, SALARY) VALUES (?, ?)", data)

七、总结

通过dmPython库,Python开发者可以无缝对接达梦数据库,实现高效的数据操作。本文从环境配置到代码实践,逐步演示了如何连接数据库并执行查询。对于实际项目,建议结合连接池、参数化查询和事务管理,确保系统的稳定性和安全性。随着国产数据库的普及,掌握达梦数据库的使用技能将成为开发者的重要竞争力。

扩展阅读

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐