Python中使用sqlite3数据库

Python中使用sqlite3数据库

Jan 4, 2014
Coding
Python, Sqlite

本文代码基于 python 2.x 版本

SQLite是一个小巧的关系型数据库,支持SQL语法。它是嵌入式的数据库,不需要安装后台的服务,或者说它是一个文件型的数据库。只需要在程序中加载几个相关文件,就可以使用。相比于MSSQL、MYSQL这种(中)大型的数据库来说,使用起来可谓相当方便。

sqlite3,即SQLite的第3个主版本,目前最新的版本是3.8.2。Python中默认自带了sqlite3模块,用户不需要安装sqlite就可以直接导入sqlite3模块以使用。

开始 #

Python 中使用sqlite3的具体步骤如下:

  • (1) 导入sqlite3模块
  • (2) 使用sqlite3.connect()建立数据库连接
  • (3) 使用数据库连接对象执行SQL语句
  • (4)关闭数据库连接

下面是一个使用sqlite3最基本的代码

#-*- coding: utf-8 -*-
import sqlite3 #导入sqlite3模块

conn = sqlite3.connect('example.db')#建立数据库连接
conn.execute('Create Table Users(name TEXT,age INTEGER)”')#执行sql
conn.commit()#提交更改
conn.close() #关闭数据库连接

代码详解 #

import sqlite3 #

导入sqlite3模块。Python自带,无需安装,使用相当方便。

sqlite3.connect() #

该函数用来建立数据库连接,其参数列表是(database[, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements])。除第一个参数database外,其它参数可选。

  • database:指定要建立连接的数据库名。如果设置为“:memory:”,则建立一个内存中的数据库,不会存放到磁盘。
  • timeout:如果数据库正在被其它连接使用,则其它连接的transaction(事务)提交之前,该数据库会被锁定。timeout指示如果要连接的数据库被锁定了,最长等待时间。默认5秒。
  • detect_types:默认为0,即不进行类型检查。该参数与register_converter()配合来增加新的数据库类型。
  • isolation_level:事务的隔离等级。默认为None,即自动提交模式,或者是“DEFERRED”、 “IMMEDIATE” 、 “EXCLUSIVE”中的一个。
  • check_same_thread:
  • factory:用户自己继承自Connect类的一个数据库连接类。(默认情况下是使用sqlite3提供的Connect类)
  • cached_statements:缓存sql语句条数。默认为100条。(sqlite中使用了sql语句缓存来提高效率) 如果要连接的数据库不存在,该函数会新建一个数据库。sqlite3.connect()函数执行成功,会返回一个sqlite3.Connection对象(conn)

Connection对象 #

数据库连接的对象[1]。其主要方法有execute()执行SQL语句、executemany()执行多条SQL语句、rollback()回滚、cursor()获取cursor对象、close()关闭连接…

Connection.execute() #

该函数用来执行一条SQL语句。参数列表(sql[, parameters])。这是一个非标准的快捷方法,它创建一个临时的cursor(游标)对象,然后使用该cursor对象的execute()方法来执行该条SQL语句。但是它不能获取SQL语句的返回结果(如select),所以通常用来执行没有返回结果的SQL语句。如上面代码的Create Table语句。如果需要返回执行结果,则需要使用Cursor对象。

Connection.commit() #

该函数用来提交当前的事务(transaction)。如果你不调用该函数,自上次调用commit()之后你所做的更改对其它的数据库连接对象是不可见的。推荐在执行对数据库有更改的SQL语句后,立即调用commit()。

Connection.close() #

该函数用来关闭数据库连接对象。

Cursor对象 #

上面说过,Connection对象的execute()函数执行SQL语句其实是内部创建了一个Cursor对象,而且Connection.execute()不能返回执行结果集。如果要返回执行结果,比如select语句的查询结果集,则使用Cursor对象。

Cursor对象是Connection对象的一个域。使用Cursor对象执行SQL语句的示例代码如下:

#-*- coding: utf-8 -*-
import sqlite3 #导入sqlite3模块

conn = sqlite3.connect('example.db')#建立数据库连接
cursor = conn.cursor() #获取cursor对象

#创建
cursor.execute('Create Table Users(name TEXT primary key,age INTEGER)”' )
conn.commit()

#插入
cursor.execute('insert into Users values ('Jarvis',25) ”')
cursor.execute('insert into Users values ('Chu',25) ”')
conn.commit()

#查询
cursor.execute('select * from Users”')
for row in cursor:
print row, row[0], row[1]
#输出结果为
# (u'Jarvis', 25) Jarvis 25
# (u'Chu', 25) Chu 25

conn.close()

Cursor.execute() #

用来执行SQL语句。如果要在SQL语句加入变量,有两种方式,如下代码所示。

#该段代码摘选自官方文档
import sqlite3

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table people (name_last, age)")

who = "Yeltsin"
age = 72

# This is the qmark style:
cur.execute("insert into people values (?, ?)", (who, age))

# And this is the named style:
cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age})

print cur.fetchone()

Cursor.executescript() #

用来执行一段SQL脚本代码。这样就可以不局限于一条SQL语句,可以执行一段SQL代码

Cursor.fetchone()、Cursor.fetchmany()、Cursor.fetchall()

都是用来取回查询结果集。不同之处在于每次取回的数量。fetchone每次返回查询结果集中的一行,并自动移至下一行,如果没有数据,则返回None;fetchmany(size)返回指定数目行;fetchall()返回查询结果集的所有行。

数据类型 #

sqlite3中只有5种原生数据类型:NULL,INTEGER,REAL,TEXT,BLOB,分别表示空、整数、实数、文本、数据块。sqlite3中的数据类型。Python中的数据类型与sqlite3中的类型对应关系如下官方文档

Python类型到sqlite3类型的默认对应转换关系

Python type SQLite type
None NULL
int INTEGER
long INTEGER
float REAL
str (UTF8-encoded) TEXT
unicode TEXT
buffer BLOB

sqlite3类型到Python类型的默认对应转换关系

SQLite type Python type
NULL None
INTEGER int or long, depending on size
REAL float
TEXT depends on text_factory, unicode by default
BLOB buffer

如果需要存储其它的Python数据类型,比如我们自定义的class,则需要通过适配器(adapter)来完成。具体方法有两种:

(1) 让对象本身自适应 #

比如有一个Point类,有两个参数x,y。如果我们需要sqlite3存储为x;y的形式,则需要在Point类中增加__conform__(self, protocol)函数,使用return语句返回要存储的形式。如下代码所示

import sqlite3

class Point(object):
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __conform__(self, protocol):
        if protocol is sqlite3.PrepareProtocol:
            return "%f;%f" % (self.x, self.y)

con = sqlite3.connect("test.db")#:memory:
cur = con.cursor()

cur.execute('create table Test(data)”')

p = Point(4.0, -3.2)
cur.execute('insert into Test values(?)”',(p,))
#p在数据库中存储为:4.000000;-3.200000
con.commit()

cur.execute("select * from Test")
print cur.fetchone()[0]
#输出 4.000000;-3.200000

(2) 注册一个适配器回调函数 #

使用register_adapter()函数注册一个回调函数,声明对某个Python类型如果作转换。示例代码如下

import sqlite3

class Point(object):
    def __init__(self, x, y):
        self.x, self.y = x, y

    def adapt_point(point):
        return "%f;%f" % (point.x, point.y)

sqlite3.register_adapter(Point, adapt_point)

con = sqlite3.connect(":memory:")
cur = con.cursor()

p = Point(4.0, -3.2)
cur.execute("select ?", (p,))
print cur.fetchone()[0]

更多内容,参阅官方文档