zoukankan      html  css  js  c++  java
  • python之sqlite3 用法详解

    Python SQLITE数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身。它使用一个文件存储整个数据库,操作十分方便。它的最大优点是使用方便,功能相比于其它大型数据库来说,确实有些差距。但是性能表现上,SQLITE并不逊色。麻雀虽小,五脏俱全, sqlite 实现了多数 sql-92 的标准,比如说 transaction 、 trigger 和复杂的查询等。

    python的数据库模块有统一的接口标准,所以数据库操作都有统一的模式,基本上都是下面几步(假设数据库模块名为db):

    1. 用db.connect创建数据库连接,假设连接对象为conn
    2. 如果该数据库操作不需要返回结果,就直接用conn.execute查询,根据数据库事务隔离级别的不同,可能修改数据库需要conn.commit
    3. 如果需要返回查询结果则用conn.cursor创建游标对象cur, 通过cur.execute查询数据库,用cur.fetchall/cur.fetchone/cur.fetchmany返回查询结果。根据数据库事 务隔离级别的不同,可能修改数据库需要conn.commit
    4. 关闭cur, conn

    下面让我们一步步走进Python中的SQLite吧。

    一,Python SQLITE数据库导入模块:

    import sqlite3

    二,创建数据库/打开数据库:

    cx = sqlite3.connect("E:/test.db")

    其实我们不需要显式的创建一个sqlite数据库,在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。

    三,数据库连接对象:

    打开数据库时返回的对象cx就是一个数据库连接对象,它可以有以下操作:

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

    四,Python SQLITE数据库游标的使用:

    游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。

    游标总是与一条SQL  选择语句相关联。因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功, 该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。

    我们知道关系数据库管理系统实质是面向集合的,在Sqlite中并没有一种描述表中单一记录的表达形式,除非使用where  子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。由此可见,游标允许应用程序对查询语句select  返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

    下面着重阐述cursor游标的使用。其实,所有sql语句的执行都要在游标对象下进行。

    首先,定义一个游标:

    cu = cx.cursor()

    这样定义了一个游标。游标对象有以下的操作:

    execute()--执行sql语句   executemany--执行多条sql语句   close()--关闭游标   fetchone()--从结果中取一条记录,并将游标指向下一条记录   fetchmany()--从结果中取多条记录   fetchall()--从结果中取出所有记录   scroll()--游标滚动 下面就使用Python SQLITE数据库中游标对我们上面建立的数据库作一些操作吧:

    1,建表:

    cu.execute('create table catalog (id integer primary key,
        pid integer,name varchar(10) UNIQUE)')

    上面语句创建了一个叫catalog的表,它有一个主键id,一个pid,和一个name,name是不可以重复的。

    2,插入数据:

    cu.execute("insert into catalog values(0, 0, 'name1')")
    cu.execute("insert into catalog values(1, 0, 'hello')")

    简单的插入两行数据,不过需要提醒的是,只有提交了之后,才能生效.我们使用数据库连接对象cx来进行提交commit和回滚rollback操作.

    cx.commit()

    3,查询:

    cu.execute("select * from catalog")

    要提取查询到的数据,使用游标的fetch***函数,如:

    print cu.fetchall()

    返回结果如下:
    [(0, 0, u'name1'), (1, 0, u'hello')] 

    如果我们使用cu.fetchone(),则首先返回列表中的第一项,再次使用,则返回第二项,依次下去.

    4,修改:

    cu.execute("update catalog set name='name2' where id = 0") 
    cx.commit() ### 注意,修改数据以后提交

    5,删除:

    cu.execute("delete from catalog where id = 1")  
    cx.commit()

    以上简单的操作反应的Python SQLITE数据库操作的基本要点,这里点到为止.然后,SQLite的强大,并不仅限于此,其对SQL高级特性的支持及其小巧灵活的特点,使得SQLite在众多领域受到开发者的青睐.

    举例:

     Exemplary exemplar 1

     1 import sqlite3
     2 con = sqlite3.connect('mydatabase.db')
     3 cur = con.cursor()
     4 cur.execute('CREATE TABLE foo (o_id INTEGER PRIMARY KEY,
     5     fruit VARCHAR(20), veges VARCHAR(30))')
     6 con.commit()
     7 cur.execute('INSERT INTO foo (o_id, fruit, veges) 
     8     VALUES(NULL, "apple", "broccoli")')con.commit()
     9 print cur.lastrowid
    10 cur.execute('SELECT * FROM foo')
    11 print cur.fetchall()

      Exemplary exemplar 2

     1 #-*- encoding:gb2312 -*-
     2 import sqlite3
     3 conn = sqlite3.connect("aaa.db")
     4 conn.isolation_level = None 
     5 #这个就是事务隔离级别,默认是需要自己commit才能修改数据库,
     6 #置为None则自动每次修改都提交,否则为""
     7 # 下面就是创建一个表
     8 conn.execute("create table if not exists 
     9     t1(id integer primary key autoincrement,
    10      name varchar(128), info varchar(128))")
    11 # 插入数据
    12 conn.execute("insert into t1(name,info) 
    13     values ('zhaowei', 'only a test')")
    14 # 如果隔离级别不是自动提交就需要手动执行
    15 commitconn.commit()
    16 # 获取到游标对象
    17 cur = conn.cursor()
    18 # 用游标来查询就可以获取到结果
    19 cur.execute("select * from t1")
    20 # 获取所有结果
    21 res = cur.fetchall()
    22 print 'row:', cur.rowcoun
    23 t# cur.description是对这个表结构的描述
    24 print 'desc', cur.description
    25 # 用fetchall返回的结果是一个二维的列表
    26 for line in res:
    27     for f in line: 
    28         print f,
    29     print
    30 print '-'*60
    31 cur.execute("select * from t1")
    32 # 这次查询后只取一个结果,就是一维列表
    33 res = cur.fetchone()
    34 print 'row:', cur.rowcount
    35 for f in res: 
    36    print f,
    37 print
    38    # 再取一行
    39 res = cur.fetchone()
    40 print 'row:', cur.rowcount
    41 for f in res: 
    42    print f,
    43 print
    44 print '-'*60
    45 cur.close()
    46 conn.close()
  • 相关阅读:
    matlab的变量判断是字符还是数字
    《误杀2》影评
    木心诗选
    Matlab查找一个元素在向量或矩阵中的位置
    数据什么时候需要做中心化和标准化处理?
    The Elements of Statistical Learning
    matlab如何将一个矩阵的任意两行或两列交换
    三次多项式和三次样条曲线的区别
    redis如何设置密码
    阿里云LAMP 环境
  • 原文地址:https://www.cnblogs.com/phil-chow/p/5347936.html
Copyright © 2011-2022 走看看