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)