zoukankan      html  css  js  c++  java
  • Python程序设计9——数据库编程

    1 数据持久化                                                             

      持久化是将内存中的对象存储在关系数据库中,当然也可以存储在磁盘文件、XML数据文件中。实现数据持久化至少需要实现以下3个接口

    void Save(object o):把一个对象保存到外存中
    Object Load(object oid):通过对象标识从外存中取回对象
    bool Exists(object oid):检查外存中是否存在某个对象

      凡是可以序列化的对象可以持久化。序列化需要实现如下两个接口:

    void Serialize(Stream stream, object o)
    object Deserialize(Stream stream):将流反序列化成对象

      序列化是为了解决对象的传输问题,序列化可以辅助持久化。

    2 Python的数据库支持                                                   

      在python中,可以使用的关系数据库又PostgreSQL、MySQL、SQLite等,为了连接数据库,需要使用connect函数。该函数有多个参数,根据连接的数据库不同而选择不同的参数。

    connect    函数中的常用参数
    dsn        数据源名称
    user       连接数据库的用户名
    password   连接数据库的密码
    host       主机名
    database   连接数据库的名称        

      使用connect函数返回一个连接对象,该对象表示目前和数据库的会话,接下来就可以使用该对象的方法来对数据库中的数据进行操作。

    2.1 connect连接对象的方法 

    close:关闭连接之后,连接对象和游标都不能用
    commit:如果支持该方法,就会提交挂起的事务,否则没有任何作用
    rollback:回滚挂起的事务
    cursor:返回一个连接的游标对象

    2.2 游标对象的方法               

    2.3 数据库编程支持模块          

      Python提供了几种持久化模块,这些模块可以模拟数据库的操作,将数据保存到指定的文件中。如dbhash、shelve、anydbm等模块。
    1.使用dbhash模块读写数据
      python标准化提供的持久化模块,可以模拟数据库操作,将数据保存到指定的文件中,这个指定的文件可以是DBM数据库。DBM是一种文件式数据库,采用哈希结构进行存储,它并不具备管理能力,但会比普通文件稳定、可靠,并且查询速度快。不同操作系统需要使用不同的python模块来实现DBM数据库,windows系统主要使用dbhash模块。dbhash模块的主要方法就是open,格式如下:
    open(filename,flag)
      上述语法中,filename表示数据库名称,flag表示数据库的打开方式,具体说有如下情况:w表示读或写数据库,r表示只读,c表示创建数据库,默认为r

    #-*- coding:UTF-8 -*-
    
    '''
    Created on 2013-8-8
    
    @author: Landau
    '''
    import os
    import dbhash
    #打开一个文件数据库,如果数据库不存在,则自动创建
    db = dbhash.open("mydb", "c")
    db["Amy"] = "beautiful"
    db["Jack"] = "Handsome"
    db["AiQi"] = "Cute"
    print "--------没有进行任何操作的数据----------"
    for k, v in db.iteritems():
        print k, v
        db.close()
    输出结果:
    --------没有进行任何操作的数据----------
    AiQi Cute
    Amy beautiful
    Jack Handsome
    View Code

      上面的数据库类似字典对象

      需要注意的是,dbhash模块的文件系统仅支持字符串类型的值,也就是db["Amy"] = 13是非法的。只能是字符串。我们可以用下面介绍的shelve模块来解决
    2.使用shelve模块读写数据
    shelve模块和python类似,但是shelve模块返回的字典类型可以支持python中的基本类型,例如字符串、数字、元组及列表等。同样shelve也有open方法。
    open(filename)
    在上述语法中,filename表示数据库的名称,如果数据库不存在,则创建该数据库。

    import shelve
    db = shelve.open("mydb1")
    db["Amy"] = ["Amy", "13312345678", "Gelunbia", 3000]
    db["Lily"] = ["Lily", "12312345678", "Gelunbia", 3500]
    db["Quinta"] = ["Quinta", "13412345678", "Gelunbia", 3800]
    db["Fei"] = ["Fei", "13712345678", "Gelunbia", 3900]
    print db
    db.close()

    输出结果:

    {'Amy': ['Amy', '13312345678', 'Gelunbia', 3000], 'Quinta': ['Quinta', '13412345678', 'Gelunbia', 3800], 'Lily': ['Lily', '12312345678', 'Gelunbia', 3500], 'Fei': ['Fei', '13712345678', 'Gelunbia', 3900]}

      shelve模块返回字典的key值只能是字符串类型,如果是其他类型,则会引发异常。

      anydbm模块和dbhash模块使用方法类似,几乎没区别。

     3.连接第三方数据库

      这里以SQLite为例

    数据库连接对象

    conn = sqlite3.connect("userDB.db")
      返回一个数据库连接对象,有如下几种操作。

    commit     提交事务
    rollback    事务回滚
    close     关闭一个数据库连接
    cursor     创建一个游标

    游标

      数据库连接成功之后,需要对SQL语句进行操作,这里所有的SQL语句都需要在游标对象下进行,创建游标对象代码如下:

    cur = conn.cursor()
    游标对象的一些操作

    execute     执行一条SQL语句
    executemany     执行多条SQL语句
    close     关闭游标
    fetchone     从结果中取出一条记录
    fetchmany     从结果中取出多条记录
    fetchall     取出所有记录
    scroll     游标滚动

      下面介绍连接SQLite数据库步骤:

    1.导入sqlite3模块
    2.调用connect创建数据库连接,返回对象conn
    3.调用conn.execute方法创建表结构或插入数据,如果设置了手动提交,则需要调用conn.commit方法提交插入的数据
    4.调用conn.cursor方法返回游标,然后通过cur.execute方法查询数据库
    5.cur.fetchall、cur.fetchmany或者cur.fetchone返回查询结果
    6.关闭游标对象cur和数据库连接对象conn
    一个例子:

    #导入sqlite3包
    import sqlite3;
    #连接数据库,如果不存在,则创建
    conn = sqlite3.connect("userDB.db")
    conn.execute("create table if not exists address (id integer primary key autoincrement, name varchar(128), address varchar(128))")
    conn.execute("insert into address(name,address) values('QiQi', 'WuHu')")
    conn.execute("insert into address(name,address) values('DaTou', 'Luan')")
    conn.commit()
    #创建一个数据库连接对象游标
    cur = conn.cursor()
    cur.execute("select * from address")
    res = cur.fetchall()
    print "address:", res
    for line in res:
        for f in line:
            print f
    cur.close()
    conn.close()
    输出结果:
    address: [(1, u'QiQi', u'WuHu'), (2, u'DaTou', u'Luan')]
    1
    QiQi
    WuHu
    2
    DaTou
    View Code

    注意:在上面插入数据库语句中,字段值不能用双引号,否则会报错。
    ps:游标是什么
      游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。游标本身并不是什么很玄的东西,提出游标概念的目的是为了对查询结果集进行各种处理。

  • 相关阅读:
    Java九种基本数据类型的大小,以及他们的封装类
    php之正则表达式
    代码开发注意事项
    提后端需求的要求
    后端上线规范
    关注公众号的微信用户收到非本人操作的充值消费记录,故障记录
    软件三层架构和MVC模式的区别
    HttpClient发送请求和接收参数
    js页面倒计时
    小程序换取openId
  • 原文地址:https://www.cnblogs.com/people/p/3247014.html
Copyright © 2011-2022 走看看