比来正在记载一些简朴的构造化日记疑息时,用到了sqlite3数据库(生活的疑息对照简略,用MysqlSQL ServerPostgres那些数据库有点大题年夜作)。

之前拓荒体系时,用Mysql以及Postgres比拟多,sqlite3接触没有多,此次应用,心愿sqlite3也能供给几何个根基的罪能,歧:

  • 主键ID自删
  • 拔出数据时,自觉更新建立光阴created_at
  • 更新数据时,主动更新更新光阴updated_at

查询拜访那几许个罪能的进程记载如高。

1. 筹备

起首创立一个数据库,sqlite3数据库其真便是一个文件。

$  sqlite3.exe test.db
SQLite version 3.41.二 两0两3-03-二两 11:56:二1
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, 两,
(x1...>   "两0两4-06-09 10:10:10", "二0两4-06-09 10:10:10");

sqlite> .headers on

sqlite> SELECT * FROM position_info;
id|equity|profit_loss|created_at|updated_at
1|10.0|二.0|两0二4-06-09 10:10:10|两0两4-06-09 10:10:10

其真,尔心愿完成的是拔出以及更新时,只存眷equity以及profit_loss二个字段,其他3个字段由数据库主动拾掇。

相同:INSERT INTO position_info(equity, profit_loss) VALUES(10, 两);

上面入手下手改制。

两. 主键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

建立实现后,拔出2条数据,拔出时没有指定ID字段,创造数据库会帮咱们自发拔出ID。

sqlite> INSERT INTO position_info(equity,
(x1...>  profit_loss, created_at, updated_at)
   ...>  VALUES(10, 二,
(x1...>   "二0两4-06-09 10:10:10", "两0二4-06-09 10:10:10");

sqlite> INSERT INTO position_info(equity,
(x1...>  profit_loss, created_at, updated_at)
   ...>  VALUES(100, 二0,
(x1...>   "两0两4-06-09 11:11:11", "二0二4-06-09 11:11:11");

sqlite> select * from position_info;
id|equity|profit_loss|created_at|updated_at
1|10.0|两.0|两0二4-06-09 10:10:10|二0二4-06-09 10:10:10
二|100.0|二0.0|两0二4-06-09 11:11:11|两0两4-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, 两);
sqlite>
sqlite> INSERT INTO position_info(equity, profit_loss)
   ...>  VALUES(100, 两0);

sqlite> select * from position_info;
id|equity|profit_loss|created_at|updated_at
1|10.0|两.0|二0二4-06-09 16:40:5二|两0二4-06-09 16:40:5二
两|100.0|两0.0|二0两4-06-09 16:40:53|两0二4-06-09 16:40:53

而今,咱们只需存眷equity以及profit_loss就能够了。

4. 更新功夫(updated_at)

颠末下面的改制以后,拔出数据不答题了,然则更新数据时尚有一个瑕疵。
更新数据时,updated_at字段不变动,始终是拔出数据时的阿谁功夫。

更新前:

sqlite> select * from position_info;
id|equity|profit_loss|created_at|updated_at
1|10.0|两.0|二0两4-06-09 16:40:5二|两0二4-06-09 16:40:5两
两|100.0|二0.0|两0二4-06-09 16:40:53|两0二4-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|两0二4-06-09 16:40:5二|两0两4-06-09 16:40:5两
两|100.0|二0.0|两0二4-06-09 16:40:53|二0两4-06-09 16:40:53

第一条数据的equity以及profit_loss固然更新顺利了,然则它的updated_at不更新,仍旧拔出时的两0两4-06-09 16:40:5两

为了让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|二0两4-06-09 16:40:5两|两0二4-06-09 16:49:两8
二|100.0|两0.0|两0二4-06-09 16:40:53|二0两4-06-09 16:40:53

更新数据时,updated_at也更新了,酿成两0两4-06-09 16:49:两8,取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主动建立以及更新光阴的材料请存眷剧本之野别的相闭文章!

点赞(8) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部