sqlite-utils 3.36使用体会(二)创建表

本文介绍了如何在SQLite-utils中使用insert_all函数动态创建表,以及create语句创建表的方法,包括可选参数如主键、排序、类型定义等。还探讨了多对多关系(m2m)的建立与操作。
摘要由CSDN通过智能技术生成

前面讲的是最简单的纯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手册

一个简单的基于Android的Sqlite数据库的操作封装,它有如下的好处:便捷地创建表和增添表字段灵活的数据类型处理通过操作对象来insert或者update表记录支持多种查询方式,支持多表自定义的复杂查询,支持分页查询支持事务快速开始:    1. 设计表:@Table(name="t_user") public class UserModel {     @Table.Column(name="user_id",type=Column.TYPE_INTEGER,isPrimaryKey=true)     public Integer userId;     @Table.Column(name="user_name",type=Column.TYPE_STRING,isNull=false)     public String userName;     @Table.Column(name="born_date",type=Column.TYPE_TIMESTAMP)     public Date bornDate;     @Table.Column(name="pictrue",type=Column.TYPE_BLOB)     public byte[] pictrue;     @Table.Column(name="is_login",type=Column.TYPE_BOOLEAN)     public Boolean isLogin;     @Table.Column(name="weight",type=Column.TYPE_DOUBLE)     public Double weight; }2. 初始化对象:SQLiteDatabase db = context.openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); DbSqlite dbSqlite = new DbSqlite(db); IBaseDao userDAO = DaoFactory.createGenericDao(dbSqlite, UserModel.class);3. 创建表:userDAO.createTable(); 4. Insert 记录:UserModel user = new UserModel(); user.userName = "darcy"; user.isLogin = true; user.weight = 60.5; user.bornDate = new Date(); byte[] picture = {0x1,0x2,0x3,0x4}; user.pictrue = picture; userDAO.insert(user);5. Update 记录:UserModel user = new UserModel(); user.weight = 88.0; userDAO.update(user, "user_name=?", "darcy");6. 查询://单条结果查询 UserModel user = userDAO.queryFirstRecord("user_name=?", "darcy"); //一般查询 List userList = userDAO.query("user_name=? and weight > ?", "darcy" , "60"); //分页查询 PagingList pagingList = userDAO.pagingQuery(null, null, 1, 3);7. 事务支持:DBTransaction.transact(mDb, new DBTransaction.DBTransactionInterface() {         @Override         public void onTransact() {             // to do                 } };8. 更新表(目前只支持添加字段)@Table(name="t_user" , version=2) //修改表版本 public class UserModel {     //members above...     //new columns     @Table.Column(name="new_column_1",type=Column.TYPE_INTEGER)     public Integer newColumn;     @Table.Column(name="new_column_2",type=Column.TYPE_INTEGER)     public Integer newColumn2; } userDAO.updateTable();缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持表的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值