前面讲的是最简单的纯SQL语句操作,事实上,在sqlite-utils中,也有很多自己的操作方法。
创建表是一个完全可有可无的事,一般采取直接插入数据的方式就完成了
通过插入数据的方式来创建表
通过这个方式来创建表,最大的好处,不必单独在程序初始化时建立表了,通过一个标准值来设立表结构,也防止了表结构与数据不一致。
本来Sqlite的数据类型就很少,Sqlite-utils更是把它简单地归类于 int text float bulb,完全放弃了char。
from sqlite_utils import *
db=Database('scroe.db')
db["ath1"].insert_all([{
"id":1,
"name": "Azi",
"color": "blue",
"is_active":True,
}, {
"name": "Lila",
"color": "blue",
}, {
"name": "Suna",
"color": "gold",
}, {
"name": "Cardi",
"color": "black",
}],pk="id")
通过这一段代码,用insert_all,第一个参数是字典数组,第二个参数是主键字段,在第一行中输入了ID值,并在最后把ID值设置为主键,实际结果如图。如果表已存在,就执行插入操作,如果表不存在,就进行建表,并插入。
由于sqlite没有布尔值,所以也用int类型来存储布尔值。
数据如上图所示。
这是一次性插入多条,如果插入一条也建立表,也是类似
db["ath1"].insert({"id": 1, "name": "Cleo","color":"blue","is_active":True}, pk="id")
在利用插入来创建表时,还有一些参数可选,主要是这些:
1、如果表已存在,是否重建
if_not_exists=True
2、对字段进行排序
column_order=(“id”, “twitter”, “name”)
3、对字段定义类型
columns={“age”: int, “weight”: float}
4、如果多键值复合主键
pk=(“breed”, “id”)
5、如果要定义外键
foreign_keys=[(“author_id”, “authors”)]
6、非空
not_null={“name”, “score”}
7、默认值
defaults={“score”: 1}
通过create语句创建
这个在使用中反而变得比较小众了,简单写一下,也看得懂
db["cats"].create({
"id": int,
"name": str,
"weight": float,
}, pk="id", if_not_exists=True)
它的参数与上面相同,不重复列举了。
通过插入数值建立多层数据对照表
sqlite-utils可以通过插入多层数据的方式,直接建立多个对照表
比如,在建立运动员信息时,项目是100米跑,比赛是省运会,可以这样写:
db["ath2"].insert(
{
"name":"张三",
"match_id":db["match"].lookup(
{"match_name":"100米",
"game_id":db["game"].lookup(
{"game":"省运会"}
)
}
)
}
,pk="id")
生成如下三张表
具体数据可以脑补,就不给大家一一列举了。
通过m2m方式建立表
m2m就是多对多关系 many to many,比如,不同的书可能在不同的书店里卖,同一本书可能出现在不同书店这样的关系。
可以用一句话来完成。
db["books"].insert({"id": 1, "name": "python教程"}, pk="id").m2m(
"shops", {"id": 1, "name": "新华书店"}, pk="id"
)
这样一句话,建立了 shops 、 books 、 books_shops三张表。
在使用时,可以用这样的方法来操作
db["books"].update(1).m2m(
"shops", {"id": 2, "name": "外文书店"}, pk="id"
)
具体操作可以再仔细看手册
sqlite-utils手册