python sqlite3

来源:互联网 发布:剑灵24人本优化不卡 编辑:程序博客网 时间:2024/05/29 14:51

SQLite,是一款轻型的数据库。关系型数据库管理系统  大小写敏感
1.导入Python SQLITE数据库模块

     Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~

import sqlite3


2. 创建/打开数据库 

     在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。

cx = sqlite3.connect("E:/test.db")
     也可以创建数据库在内存中。
con = sqlite3.connect(":memory:")

3.数据库连接对象

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

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

    关于commit(),如果isolation_level隔离级别默认,那么每次对数据库的操作,都需要使用该命令,你也可以设置isolation_level=None,这样就变为自动提交模式。

 

4.使用游标查询数据库 (使用游标比较方便执行sql语句等操作)

    我们需要使用游标对象SQL语句查询数据库,获得查询对象。 通过以下方法来定义一个游标。

cu=cx.cursor()

 

     游标对象有以下的操作:
  1. execute()--执行sql语句   
  2. executemany--执行多条sql语句   
  3. close()--关闭游标   
  4. fetchone()--从结果中取一条记录,并将游标指向下一条记录   
  5. fetchmany()--从结果中取多条记录   
  6. fetchall()--从结果中取出所有记录   
  7. scroll()--游标滚动  

1. 建表

cu.execute("create table catalog (id integer primary key,pid integer,name varchar(10)UNIQUE,nickname text NULL)")

上面语句创建了一个叫catalog的表。键值之间用,分割。创建了id tnterger类型的主键,pid interger类型,name 最大长度为10的text类型唯一的,nickname text类型,默认为null

2. 插入数据 

请注意避免以下写法:

# Never do this -- insecure 会导致注入攻击

pid
=200
c.execute(
"... where pid = '%s'" % pid)
正确的做法如下,如果t只是单个数值,也要采用t=(n,)的形式,因为元组是不可变的。 
for t in[(0,10,'abc','Yu'),(1,20,'cba','Xu')]:
    cx.execute(
"insert into catalog values (?,?,?,?)", t)
用?占位符,简单的插入两行数据,不过需要提醒的是,只有提交了之后,才能生效.我们使用数据库连接对象cx来进行提交commit和回滚rollback操作.
cx.commit()

 

3.查询——每次查询 必须先筛选cu.execute,然后cu.fetchall()

cu.execute("select * from catalog"

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

cu.fetchall()
[(0, 10, u'abc', u'Yu'), (120, u'cba', u'Xu')]

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

 

4.修改

In [12]: cu.execute("update catalog set name='Boy' where id = 0")
In [
13]: cx.commit()

注意,修改数据以后提交

 

5.删除

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

 

6.使用中文

请先确定你的IDE或者系统默认编码是utf-8,并且在中文前加上u 

x=u''
cu.execute(
"update catalog set name=? where id = 0",x)
cu.execute(
"select * from catalog")
cu.fetchall()
[(0, 
10, u'\u9c7c', u'Yu'), (120, u'cba', u'Xu')]

如果要显示出中文字体,那需要依次打印出每个字符串

复制代码
In [26]: for item in cu.fetchall():
   ....:     
for element in item:
   ....:         
print element,
   ....:     
print
   ....: 
10 鱼 Yu
1 20 cba Xu
复制代码

7.Row类型

Row提供了基于索引和基于名字大小写敏感的方式来访问列而几乎没有内存开销

    下面举例说明

复制代码
In [30]: cx.row_factory = sqlite3.Row

In [
31]: c = cx.cursor()

In [
32]: c.execute('select * from catalog')
Out[
32]: <sqlite3.Cursor object at 0x05666680>

In [
33]: r = c.fetchone()

In [
34]: type(r)
Out[
34]: <type 'sqlite3.Row'>

In [
35]: r
Out[
35]: <sqlite3.Row object at 0x05348980>

In [
36]: print r
(0, 
10, u'\u9c7c', u'Yu')

In [
37]: len(r)
Out[
37]: 4

In [
39]: r[2]            #使用索引查询
Out[
39]: u'\u9c7c'

In [
41]: r.keys()
Out[
41]: ['id''pid''name''nickname']

In [
42]: for e in r:
   ....:     
print e,
   ....: 
10 鱼 Yu
复制代码

 使用列的关键词查询

In [43]: r['id']
Out[
43]: 0

In [
44]: r['name']
Out[
44]: u'\u9c7c'

 

 



原创粉丝点击