python 标准库 sqlite3 介绍(一)

2019-08-14 17:02:09 浏览数 (1)

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的功能特点有:

1. ACID事务

2. 零配置 – 无需安装和管理配置

3.储存在单一磁盘文件中的一个完整的数据库

4.数据库文件可以在不同字节顺序的机器间自由的共享

5.支持数据库大小至2TB

6. 足够小, 大致13万行C代码, 4.43M

7. 比一些流行的数据库在大部分普通数据库操作要快

8. 简单, 轻松的API

9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定

10. 良好注释的源代码, 并且有着90%以上的测试覆盖率

11. 独立: 没有额外依赖

12. 源码完全的开源, 你可以用于任何用途, 包括出售它

13. 支持多种开发语言,C, C , PHP, Perl, Java, C#,Python, Ruby等

sqlite3 是SQLite的python接口,由Gerhard Häring编写,属于python的标准库,无需额外安装。下面介绍sqlite3的用法。

创建数据库(的连接):

代码语言:javascript复制
import sqlite3
conn = sqlite3.connect('动物记录.db')#到磁盘,#无则新建,有则连接
#conn = sqlite3.connect(":memory:")#在内存中创建临时数据库,存取速度极快

创建游标:

代码语言:javascript复制
# 对于数据库的表的操作是通过游标进行的,所以在操作之前要获取游标对象
c = conn.cursor()

创建表(可以创建多个):

代码语言:javascript复制
# IF NOT EXISTS 表示 仅当表不存在时才创建
#PRIMARY KEY 主键约束(值唯一)
#NOT NULL 值非空约束
c.execute('''CREATE TABLE IF NOT EXISTS pets 
             (id INTEGER PRIMARY KEY, name TEXT , type TEXT NOT NULL, sex CHAR(1), weight real)''')

sqlite 和 python的数据类型对照表:

更多的SQL的 语法请参考下面的链接:https://www.runoob.com/sqlite/sqlite-syntax.html

向表中加数据:

代码语言:javascript复制
# 增加一行数据
c.execute("INSERT INTO pets VALUES (1,'Tom', '猫', 'male', 5)")
#可以只给定部分值,未给定值的为Null(当然,有非空约束的不能为空), 对应python类型 None
c.execute("INSERT INTO pets(id, name, type) VALUES (2,'喜洋洋', '羊')")

#可以用普通的 python 字符串格式化:
c.execute("INSERT INTO pets VALUES (3, '%s', '兔', '%s', 2.5)" %("Peter", "female"))
c.execute("INSERT INTO pets VALUES (4, '{}', '猪', '{}', 2.5)" . format("佩奇", "male"))
#'my name is {} ,age {}'.format('hoho',18)

#还可以是 execute()带两个参数,"?" 做 占位符
c.execute("INSERT INTO pets VALUES (5, ?, ?, 'male', 0.5)" ,  ["Jerry", "鼠"])
records =[ [8,'吉吉', 'monkey', 'male', 30],
            [9,'熊大', 'bear', 'male', 300],
            [10,'熊二', 'bear', 'male', 280]]
# 增加多行数据
c.executemany("INSERT INTO pets VALUES (?, ?,?,?,?)", records)

保存更改:

代码语言:javascript复制
conn.commit()#提交更改

#关闭与数据库的连接
#conn.close()
#不能操作已关闭的数据库,报错:sqlite3.ProgrammingError: Cannot operate on a closed database.
#必须重新建立与数据库的连接
#conn = sqlite3.connect('动物记录.db')
#c = conn.cursor()

询:

代码语言:javascript复制
# 查询
c.execute("SELECT * FROM pets")
print(c.fetchone()) #查询一条记录
print(c.fetchmany(3))#查询(剩余)多条记录
print(c.fetchall())#查询(剩余)全部记录
print()

#查询部分列
for row in c.execute("SELECT name,weight FROM pets"):
    print(row)
print()

#条件查询
c.execute("select * from pets where weight > ?", (15, ))
print(c.fetchall())

#多条件查询
c.execute("select * from pets where weight <= ? and sex = ? ", (15, "female")) # 与
print(c.fetchall())
c.execute("select * from pets where weight <= ? or sex = ? ", (15, "female")) #或
print(c.fetchall())

#查询统计数据
c.execute("select count(*) from pets where sex = ? ", ( "male", )) #求数量
n =c.fetchone()[0];  print("count: ", n)
c.execute("select AVG(weight) from pets where sex = ? ", ( "male", )) #求平均值,自动忽略空值
avg = c.fetchone()[0]; print("average: ", avg)
c.execute("select Max(weight) from pets where sex = ? ", ( "male", )) #求最大值,自动忽略空值
print("Max: ", c.fetchone()[0])
c.execute("select Min(weight) from pets where sex = ? ", ( "male", )) #求最小值,自动忽略空值
print("Min: ", c.fetchone()[0])
#可以是计算式
c.execute("select (weight-%f)*(weight-%f) from pets where sex = ? "%(avg,avg) , ( "male", ))
sqr = c.fetchone()[0]
from math import sqrt
print("std: ", sqrt(sqr)/(n-1))

#排序
rows = c.execute("SELECT * FROM pets ORDER BY weight")#ASC(默认升序) ,DESC
for row in rows:
    print(row)
print()
#降序排列
rows = c.execute("SELECT * FROM pets ORDER BY weight DESC")#DESC
for row in rows:
    print(row)

0 人点赞