it编程 > 数据库 > Sqlite

sqlite3自动插入创建时间和更新时间的功能实现

240人参与 2024-07-03 Sqlite

最近在记录一些简单的结构化日志信息时,用到了sqlite3数据库(保存的信息比较简单,用mysqlsql serverpostgres这些数据库有点小题大做)。

以前开发系统时,用mysqlpostgres比较多,sqlite3接触不多,这次使用,希望sqlite3也能提供几个基本的功能,比如:

调查这几个功能的过程记录如下。

1. 准备

首先创建一个数据库,sqlite3数据库其实就是一个文件。

$  sqlite3.exe test.db
sqlite version 3.41.2 2023-03-22 11:56:21
enter ".help" for usage hints.
sqlite>

这里不需要管 test.db 文件存不存在,如果不存在,会自动创建的。

创建一张表 position_info,这是我用来记录账户净值和利润的表,其中字段的作用不用管,只需要关注 idcreated_atupdated_at三个字段即可。

sqlite> create table if not exists position_info (
(x1...>     id integer not null primary key,
(x1...>     equity real not null,
(x1...>     profit_loss real not null,
(x1...>     created_at text not null,
(x1...>     updated_at text not null
(x1...> );

创建之后,通过sqlite3的命令查看position_info表是否创建。

sqlite> .tables
position_info

sqlite3的自带命令都是以点号.)开头的。

表按照默认的方式创建之后, 发现插入一条数据很麻烦,需要指定position_info表中所有5个字段才能插入成功。

sqlite> insert into position_info(id, equity,
(x1...>  profit_loss, created_at, updated_at)
   ...>  values(1, 10, 2,
(x1...>   "2024-06-09 10:10:10", "2024-06-09 10:10:10");

sqlite> .headers on

sqlite> select * from position_info;
id|equity|profit_loss|created_at|updated_at
1|10.0|2.0|2024-06-09 10:10:10|2024-06-09 10:10:10

其实,我希望实现的是插入和更新时,只关注equityprofit_loss两个字段,其他3个字段由数据库自动管理。

类似:insert into position_info(equity, profit_loss) values(10, 2);

下面开始改造。

2. 主键id自增

首先,让主键id能够自动增长。

sqlite> drop table position_info;
sqlite> create table if not exists position_info (
(x1...>     id integer not null primary key autoincrement,
(x1...>         equity real not null,
(x1...>         profit_loss real not null,
(x1...>     created_at text not null,
(x1...>     updated_at text not null
(x1...> );
sqlite> select * from position_info;
sqlite>

先删除创建的 position_info,然后重新创建position_info表,创建时指定id integer not null primary key autoincrement

创建完成后,插入两条数据,插入时不指定id字段,发现数据库会帮我们自动插入id。

sqlite> insert into position_info(equity,
(x1...>  profit_loss, created_at, updated_at)
   ...>  values(10, 2,
(x1...>   "2024-06-09 10:10:10", "2024-06-09 10:10:10");

sqlite> insert into position_info(equity,
(x1...>  profit_loss, created_at, updated_at)
   ...>  values(100, 20,
(x1...>   "2024-06-09 11:11:11", "2024-06-09 11:11:11");

sqlite> select * from position_info;
id|equity|profit_loss|created_at|updated_at
1|10.0|2.0|2024-06-09 10:10:10|2024-06-09 10:10:10
2|100.0|20.0|2024-06-09 11:11:11|2024-06-09 11:11:11

3. 创建时间(created_at)

接下来,设置创建时间created_at)和更新时间updated_at)自动插入:default (datetime('now', 'localtime'))

sqlite> drop table position_info;
sqlite> create table if not exists position_info (
(x1...>     id integer not null primary key autoincrement,
(x1...>         equity real not null,
(x1...>         profit_loss real not null,
(x1...>     created_at text not null default (datetime('now', 'localtime')),
(x1...>     updated_at text not null default (datetime('now', 'localtime'))
(x1...> );

然后插入两条测试数据:

sqlite> insert into position_info(equity, profit_loss)
   ...>  values(10, 2);
sqlite>
sqlite> insert into position_info(equity, profit_loss)
   ...>  values(100, 20);

sqlite> select * from position_info;
id|equity|profit_loss|created_at|updated_at
1|10.0|2.0|2024-06-09 16:40:52|2024-06-09 16:40:52
2|100.0|20.0|2024-06-09 16:40:53|2024-06-09 16:40:53

现在,我们只要关注equityprofit_loss就可以了。

4. 更新时间(updated_at)

经过上面的改造之后,插入数据没有问题了,但是更新数据时还有一个瑕疵。
更新数据时,updated_at字段没有变化,一直是插入数据时的那个时间。

更新前:

sqlite> select * from position_info;
id|equity|profit_loss|created_at|updated_at
1|10.0|2.0|2024-06-09 16:40:52|2024-06-09 16:40:52
2|100.0|20.0|2024-06-09 16:40:53|2024-06-09 16:40:53

更新第一条数据:

sqlite> update position_info set equity=500, profit_loss=100
   ...> where id = 1;
sqlite> select * from position_info;
id|equity|profit_loss|created_at|updated_at
1|500.0|100.0|2024-06-09 16:40:52|2024-06-09 16:40:52
2|100.0|20.0|2024-06-09 16:40:53|2024-06-09 16:40:53

第一条数据的equityprofit_loss虽然更新成功了,但是它的updated_at没有更新,还是插入时的2024-06-09 16:40:52

为了让updated_at也能自动更新,需要加一个监听器,当数据有更新时,更新此数据的updated_at字段。

sqlite> create trigger if not exists trigger_position_info_updated_at after update on position_info
   ...> begin
   ...>     update position_info set updated_at = datetime('now', 'localtime') where rowid == new.rowid;
   ...> end;

再更新一次数据看看:

sqlite> update position_info set equity=1000, profit_loss=300
   ...> where id = 1;
   
sqlite> select * from position_info;
id|equity|profit_loss|created_at|updated_at
1|1000.0|300.0|2024-06-09 16:40:52|2024-06-09 16:49:28
2|100.0|20.0|2024-06-09 16:40:53|2024-06-09 16:40:53

更新数据时,updated_at也更新了,变成2024-06-09 16:49:28,与created_at不再一样。

5. 总结

最后,创建一个带有自增id,自动插入创建时间更新时间的完整sql如下:

create table if not exists position_info (
    id integer not null primary key autoincrement,
    equity real not null,
    profit_loss real not null,
    created_at text not null default (datetime('now', 'localtime')),
    updated_at text not null default (datetime('now', 'localtime'))
);

create trigger if not exists trigger_position_info_updated_at after update on position_info
begin
    update position_info set updated_at = datetime('now', 'localtime') where rowid == new.rowid;
end;

以上就是sqlite3自动插入创建时间和更新时间的功能实现的详细内容,更多关于sqlite3自动创建和更新时间的资料请关注代码网其它相关文章!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

SQLite速度评测代码

05-18

SQLite优化方法

05-18

Sqlite 常用函数 推荐

05-18

Sqlite 操作类代码

05-18

保护你的Sqlite数据库(SQLite数据库安全秘籍)

05-18

SQLite数据库管理系统-我所认识的数据库引擎

05-18

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论