在PYTHON语言中操作达梦数据库

PYTHON语言中操作达梦数据库

 

Python(派森)语言是一种面向对象的用途非常广泛的编程语言,具有非常清晰的语法特点,适用于多种操作系统,可以在Windows和Unix这样的系统中运行。目前Python在国际上非常流行,正在得到越来越多的应用。Python可以完成许多任务,功能非常强大。在使用Python开发数据库应用程序时,如何正确地建立与各种数据库的连接并进行数据操作是一个十分关键的问题。本文写作目的是通过示例介绍Windows下如何通过Python实现对达梦(以下简称DM)数据库的操作。

一、通过ODBC实现对DM数据库的操作

1 安装Python开发环境

在Windows上,安装Python有两种选择:

第一种是ActiveState制作的ActivePython,它是专门针对Windows的Python套件,它包含一个完整的Python发布、一个适用于Python编程的IDE以及一些Python的Windows扩展。虽然ActivePython不是开源软件,但它可以自由下载。如果您就需要Python的最新版本,并且ActivePython仍然落后于最新版本的话,您应该直接跳到在Windows上安装Python的第二种选项。

第二种选择是使用由Python发布的官方Python安装程序。它是可自由下载的开源软件,并且您总是可以获得当前Python的最新版本。

安装ActivePython

(1)从http://www.activestate.com/Products/ActivePython/下载Active Python(本文示例采用的是ActivePython2.5.2.2);

(2)如果您正在使用Windows95、Windows 98、或Windows ME,还需要在安装ActivePython之前下载并安装Windows Installer2.0(http://download. microsoft.com/download/WindowsInstaller/Install/2.0/W9XMe/EN-US/InstMsiA.exe);

(3)双击安装程序ActivePython-2.5.2.2-win32-x86.msi;

(4)按照程序的提示一步步地执行;

(5)如果磁盘空间不足,您可以执行定制安装,但建议采用完全安装模式;

(6)在安装完成后,关闭安装程序,点击“开始”菜单选择“程序”-“ActiveState ActivePython2.5”-“PythonWin Editor”。您将看到如下信息:

Portions Copyright 1994-2006 Mark Hammond - see 'Help/About PythonWin' for further copyright information.

>>>

安装来自Python.org的Python

(1)从http://www.python.org选择最新的Python Windows安装程序,下载安装文件;

(2)双击安装程序Python-x.xxx.yyy.msi,文件名依赖于您所下载的Python安装程序文件;

(3)按照安装程序的提示信息一步步地执行;

(4)如果磁盘空间不足,可以取消HTML Help文件、使用脚本(Tools)和/或测试套件(Lib/test/);

(5)在安装完成之后,关闭安装程序,点击“开始”菜单选择“程序”-“Python3.1”-“IDLE (Python GUI)”。您将看到类似如下的信息:

Type "copyright", "credits" or "license()" for more information.

****************************************************************

Personal firewall software may warn about the connection IDLE

makes to its subprocess using this computer's internal loopback

interface. This connection is not visible on any external

interface and no data is sent to or received from the Internet.

****************************************************************

IDLE 1.0

>>>

2 DM ODBC驱动程序的安装与数据源的配置

安装达梦客户端即可实现对DM ODBC的安装,在客户机上配置ODBC数据源的步骤如下:

(1)在控制面板上访问ODBC构件,显示ODBC数据源管理器对话框。ODBC数据源管理器对话框包含的标签如下:

    1. 用户DSN:添加、删除或配置本机上的数据源,它们只可由当前用户使用。
    2. 系统DSN:添加、删除或配置本机上的数据源,它们可由任何用户使用。
    3. 文件DSN:添加、删除或配置在分离文件中的数据源。这些文件可以被安装了同样数据库驱动器的用户共享。
    4. 驱动程序:列出了安装在客户机上的数据库驱动器。
    5. 跟踪:用于测试您的数据库应用程序。它跟踪客户机和数据库服务器之间的ODBC API的调用。
    6. 连接池:允许不同的应用程序自动复用多个连接。这有助于限制和数据库服务器的通信过载。
    7. 关于:显示主要ODBC组件的版本。

 

(2)设置和配置一个系统DSN,请单击系统DSN标签,单击添加按钮增加一个新的DSN。

 

(3)选择DM ODBC 3.0驱动程序即DM ODBC DRIVER,单击完成按钮。

 

(4)输入数据源的名称,一个简单的描述,并选择你想要连接的数据库服务器的名字,使用的端口号,缺省使用的DB,验证登录用户ID真伪的方式,如果使用DMServer验证方式则需要输入登录数据源的ID以及密码等信息,选择系统提示信息的语种,以及选择是否使用DMServer的增强选项。

(5)单击测试按钮测试所配置的数据源是否正确,得到数据源测试报告,如果测试成功,可以单击确定按钮以保存所设置的新的系统数据源。

 

 

(6)单击确定按钮关闭ODBC数据源管理器对话框。

3 通过Python ODBC module链接DM数据库

PythonWin开发环境扩展了Python模块库,通过加载通用的odbc模块库,可以实现对DM数据库的操作。

运行方式:

通过PythonWin提供的IDE直接运行该示例。

源程序:

文件名:std_odbc.py

# coding = gbk

import dbi, odbc     # 加载ODBC模块

import time          # 加载 time 模块

 

def initConnection() :

    con = odbc.odbc(     # 打开数据库链接

        "dm_odbc/SYSDBA/SYSDBA"  #格式: '数据源名/用户名/密码'

        )

    return con

def select() :

    crsr = con.cursor()   # 创建游标

    crsr.execute(        # 执行SQL

        """

        SELECT * FROM BOOKSHOP.PRODUCTION.PRODUCT;

        """

        )

    result = crsr.fetchall()      # 获得结果集

    if len(result) == 0 :

        print("No datas to display!")

    else :

        i = 0

        xSize = len(result)

        ySize = len(result[0])

        while i < xSize :

            j = 0

            while j < ySize :

                print(result[i][j]),

                j = j + 1

            print("\n-------------------------------------------------------------")

            i = i + 1

    crsr.close()

def insert() :

    crsr = con.cursor()   # create a cursor

    crsr.execute(        # execute some SQL

        """

        INSERT INTO BOOKSHOP.PRODUCTION.PRODUCT(NAME,AUTHOR,PUBLISHER,PUBLISHTIME,PRODUCTNO,PRODUCT_SUBCATEGORYID,SATETYSTOCKLEVEL,ORIGINALPRICE,NOWPRICE,DISCOUNT,DESCRIPTION,PHOTO,TYPE,PAPERTOTAL,WORDTOTAL,SELLSTARTTIME,SELLENDTIME)

        VALUES('老人与海','海明威','上海出版社','2006-8-1','9787533741299',(SELECT PRODUCT_SUBCATEGORYID FROM BOOKSHOP.PRODUCTION.PRODUCT_SUBCATEGORY WHERE NAME='世界名著'),'10','10','6.1','6.1','海明威(1899一1961),美国著名作家、诺贝尔文学奖获得者。《老人与海》是他最具代表性的作品之一。','','16','98','67000','2006-03-20','');

        """

        )

    crsr.close()

def delete() :

    crsr = con.cursor()   # create a cursor

    crsr.execute(       # execute some SQL

        """

        DELETE FROM BOOKSHOP.PRODUCTION.PRODUCT WHERE NAME = '你的老人与海';

        """

        )

    crsr.close()

def update() :

    crsr = con.cursor()   # create a cursor

    crsr.execute(        # execute some SQL

        """

        UPDATE BOOKSHOP.PRODUCTION.PRODUCT SET NAME = '老人与海', PUBLISHTIME='2006-8-1'WHERE NAME = '皇帝内经'

        """

        )

    crsr.close()

def dispose() :

    con.close()

   

#+++++++++++++++++++++++++++Main++++++++++++++++++++++++++++++

con = initConnection()

select()

insert()

select()

 

delete()

select()

 

update()

select()

 

dispose()

4通过加载DM ODBC动态链接库实现数据库操作

Python作为一种功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,它可以通过内建的模块调用其他语言编写的函数链接库,来扩展自身的功能,下述示例描述如何通过加载DM OBDC动态链接库实现应用程序对数据库的操作功能。

Python通过ctypes模块实现对动态链接库的加载,ctypes模块的详细介绍请参照Python帮助文档(安装Python时如果采用默认安装方式,该帮助文档会自动安装),这里给出示例来描述Python如何通过加载dmodbc.dll来实现对DM数据库的增、删、改、查的操作。

运行方式:

通过PythonWin提供的IDE运行该示例。

源程序:

文件名:dm_odbc.py

# coding = gbk

from ctypes import *

 

#初始化链接

def initConnection() :   

    dll.SQLAllocHandle(1,None,byref(SQLHANDLE_env))             #创建环境句柄

    dll.SQLAllocHandle(2,SQLHANDLE_env,byref(SQLHANDLE_cnn))    #创建连接句柄

    dll.SQLConnect(SQLHANDLE_cnn,pdns,-3,puid,-3,ppwd,-3)       #创建连接句柄

#查询操作

def select() :

    cols = c_int(0)

    col_name = create_string_buffer(20)  #创建缓冲区用于存放列名

    col_data = create_string_buffer(256) #创建缓冲区用于存放列值

    cbcoldata = c_long(0)

    dll.SQLAllocHandle(3,SQLHANDLE_cnn,byref(SQLHANDLE_stmt))  #创建语句句柄

    dll.SQLExecDirect(SQLHANDLE_stmt,"SELECT * FROM BOOKSHOP.PRODUCTION.PRODUCT;",-3)

    dll.SQLNumResultCols(SQLHANDLE_stmt, byref(cols))

    i = 1

    while i <= cols.value :

        rc = dll.SQLDescribeCol(SQLHANDLE_stmt, i, byref(col_name), 129, None, None, None, None, None)

        print(col_name.value + "       "),

        i = i + 1

    print("\n----------------------------------------------------------")

    while True:      

        rc = dll.SQLFetch(SQLHANDLE_stmt)

        if rc == 100 :

            break

        i = 1;

        while i <= cols.value :

            dll.SQLGetData(SQLHANDLE_stmt, i, 1, byref(col_data), 256, byref(cbcoldata))

            if cbcoldata.value == -1 :

                print("NULL"),

            else :

                print(col_data.value),

            i = i + 1

        print("\n----------------------------------------------------------")

    dll.SQLFreeHandle(3, SQLHANDLE_stmt) #释放语句句柄

#插入操作

def insert() :

    dll.SQLAllocHandle(3,SQLHANDLE_cnn,byref(SQLHANDLE_stmt))  #创建语句句柄

    sql = """

        INSERT INTO BOOKSHOP.PRODUCTION.PRODUCT(NAME,AUTHOR,PUBLISHER,PUBLISHTIME,PRODUCTNO,PRODUCT_SUBCATEGORYID,SATETYSTOCKLEVEL,ORIGINALPRICE,NOWPRICE,DISCOUNT,DESCRIPTION,PHOTO,TYPE,PAPERTOTAL,WORDTOTAL,SELLSTARTTIME,SELLENDTIME)

        VALUES('老人与海','海明威','上海出版社','2006-8-1','9787633741799',(SELECT PRODUCT_SUBCATEGORYID FROM BOOKSHOP.PRODUCTION.PRODUCT_SUBCATEGORY WHERE NAME='世界名著'),'10','10','6.1','6.1','海明威(1899一1961),美国著名作家、诺贝尔文学奖获得者。《老人与海》是他最具代表性的作品之一。','','16','98','67000','2006-03-20','');

        """

    rc = dll.SQLExecDirect(SQLHANDLE_stmt,sql,-3)

    print("insert:", rc)

    dll.SQLFreeHandle(3, SQLHANDLE_stmt) #释放语句句柄

#删除操作

def delete() :

    dll.SQLAllocHandle(3,SQLHANDLE_cnn,byref(SQLHANDLE_stmt))  #创建语句句柄

    rc = dll.SQLExecDirect(SQLHANDLE_stmt,"DELETE FROM BOOKSHOP.PRODUCTION.PRODUCT WHERE NAME = '老人与海';",-3)

    print("delete:", rc)

    dll.SQLFreeHandle(3, SQLHANDLE_stmt) #释放语句句柄

 #更新操作

def update() :

    dll.SQLAllocHandle(3,SQLHANDLE_cnn,byref(SQLHANDLE_stmt))  #创建语句句柄

    rc = dll.SQLExecDirect(SQLHANDLE_stmt,"UPDATE BOOKSHOP.PRODUCTION.PRODUCT SET NAME = '老人与海', PUBLISHTIME='2006-8-1' WHERE NAME = '壮志在我胸'",-3)

    print("update:", rc)

    dll.SQLFreeHandle(3, SQLHANDLE_stmt) #释放语句句柄

#释放申请资源

def dispose() :

    dll.SQLDisconnect(SQLHANDLE_cnn)

    dll.SQLFreeHandle(2, SQLHANDLE_cnn)

    dll.SQLFreeHandle(1, SQLHANDLE_env)

 

#+++++++++++++++++++++++++++Main++++++++++++++++++++++++++++++

dll = windll.LoadLibrary("dmodbc.dll") #加载DM odbc动态链接库

#定义句柄

SQLHANDLE_env = pointer(c_long(0))  #定义环境句柄

SQLHANDLE_cnn = pointer(c_long(0))  #定义连接句柄

SQLHANDLE_stmt = pointer(c_long(0))  #定义语句句柄

#定义验证参数

pdns = c_char_p("dm_test")

puid = c_char_p("SYSDBA")

ppwd = c_char_p("SYSDBA")

 

#执行数据库操作

initConnection()

select()

#insert()

#delete()

#update()

dispose()

二、通过JDBC实现与对DM数据库的操作

Python通过Jython实现JDBC方式的数据库连接,Jython连接数据库需要附带的zxJDBC包的支持,下面给出Jython运行环境的搭建以及通过Jython实现对DM数据库操作的示例。

1 Jython环境的搭建

Jython的安装比较简单,Jython的安装程序本身就是一个Java应用程序,因此,在安装之前,您必须具备Java运行的环境。下面以Jython的Jython2.5.1为例,说明Jython的安装步骤:

(1)下载Jython安装包(http://www.jython.org/),示例所选安装包为jython_installer -2.5.1.jar;

(2)直接双击jython_installer-2.5.1.jar,启动程序安装界面;

(3)按照安装界面提示完成Jython的安装;

(4)将安装目录加入Path环境变量中,如:C:\jython2.5.1;

(5)打开命令行,输入jython,显示如下信息:

C:\Documents and Settings\Administrator>jython

[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_16

Type "help", "copyright", "credits" or "license" for more information.

>>>

2 通过Jython连接DM数据库

Jython通过附带的zxJDBC包实现对DM数据库的链接,运行下述示例时需要将DM JDBC Driver(DmJdbcDriver.jar)引入到类路径。可通过如下命令行调用方式,运行所给示例程序。

命令行调用方式:

>cd %源文件所在目录%

>set classpath=%DM JDBC Driver所在目录%\DmJdbcDriver.jar

>jython dm_jdbc.jy

源程序:

文件名:dm_jdbc.jy

# coding = gbk

from java.lang import *

from java.sql import *                 #

from dm.jdbc.driver import DmDriver    #

 

#select operate

def select() :

         st=con.createStatement()

         rs=st.executeQuery("select * from BOOKSHOP.PRODUCTION.PRODUCT")

         System.out.println("--------------------------------------------------------------")

         rsmd = rs.getMetaData()

         numCols = rsmd.getColumnCount()

         i = 1

         while i < numCols :

                  if i > 1 :

                           System.out.print("       ")

                  System.out.print(rsmd.getColumnLabel(i))

                  i = i + 1

         System.out.println("\n--------------------------------------------------------------")

         while rs.next() :

                  i = 1

                  while i < numCols :

                           if i > 1 :

                                    System.out.print("       ")

                           System.out.print(rs.getString(i))

                           i = i + 1

                  System.out.println("\n--------------------------------------------------------------")

         rs.close()

         st.close()

 

#insert operate

def insert() :

         st=con.createStatement()

         st.executeUpdate("INSERT INTO BOOKSHOP.PRODUCTION.PRODUCT(NAME, AUTHOR,PUBLISHER,PUBLISHTIME,PRODUCTNO,PRODUCT_SUBCATEGORYID,SATETYSTOCKLEVEL,ORIGINALPRICE,NOWPRICE,DISCOUNT,SELLSTARTTIME) VALUES('name1','author','publisher','2006-8-1','9787633740766',1,10,'6.1','7.1','4','2010-01-15');")

         st.close()

 

#update operate

def update() :

         st=con.createStatement()

         st.executeUpdate("UPDATE BOOKSHOP.PRODUCTION.PRODUCT SET PUBLISHTIME='2010-01-15' WHERE PUBLISHTIME='2006-08-01';")

         st.close()

 

#delete operate

def delete() :

         st=con.createStatement()

         st.executeUpdate("DELETE FROM BOOKSHOP.PRODUCTION.PRODUCT WHERE NAME LIKE 'name%';")

         st.close()

 

#dispose operate

def dispose() :

         con.close()

 

#+++++++++++++++++++++++++++Main++++++++++++++++++++++++++++++

DriverManager.registerDriver(DmDriver())

con=DriverManager.getConnection("jdbc:dm://localhost:12345", "SYSDBA", "SYSDBA")

 

select()

update()

insert()

delete()

dispose()

 


版权声明:本文为weixin_46881782原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。