【Golang】使用SQLite3查询表名列表和数据库的总记录数
在使用Golang的database/sql标准包和SQLite3驱动程序创建了数据库之后,由于需要动态创建的表,需要获取创建的表名列表。
而且,是否有方法可以随时确认已注册的记录数,即数据库中的总记录数。
从Go 1.18开始,作为天下闻名的mattn先生的”go-sqlite3″成为了默认的驱动程序。
尝试通过”golang” “sqlite3″来获得表名列表时,只能找到使用SQLite命令的.table来确认方法。同样,当通过”golang” “sqlite3″来搜索总记录数时,虽然想要获取数据库中所有记录的数量,但只能找到特定表中使用COUNT()函数来获取记录数的信息。这也是因为自己的搜索能力有限。
太长不看(今北产业)
-
- 在SQLite3中,每次调用count()都需要对表进行全面扫描,因此速度较慢。
-
- 根据规范,SQLite3不会保存表的记录数,也不会进行缓存。
-
- 因此,创建并更新一个用于计数的表是现实的选择。
更新模式
在插入和删除时设置触发器,随时增减更新计数表(会对整体性能产生影响)。
更新方法
通过WHERE type=’table’获取表名列表。
对于每个表,使用SELECT count()获取记录数。
- 参考文献: 【Golang】SQLite3 の DB で総レコード数をコードから取得したい | Q&A @ Qiita
总结一下(示例)
-
- 在 Golang 中,获取数据库中所有表名的示例。
// GetTable 是一个返回以字符串切片形式的 db 表名列表的函数。
func GetTable(db *sql.DB) ([]string, error){
result := []string{}
q := `SELECT name FROM sqlite_master WHERE type = ‘table’;`
res, err := db.Query(q)
if err != nil {
return nil, errors.Wrap(err, “failed to query database”)
}
var table string
for res.Next() {
if err := res.Scan(&table); err != nil {
return nil, errors.Wrap(err, “failed to scan table name”)
}
result = append(result, table)
}
sort.Slice(result, func(i, j int) bool {
return result[i] < result[j]
})
return result, nil
}
在 Golang 中,获取数据库内(所有表)的总记录数的示例。
func GetTotalRecords(db *sql.DB) int {
tables, err := Tables(db)
if err != nil {
return -1
}
const queryTPL = `SELECT COUNT(*) FROM %s;`
result := int(0)
for _, table := range tables {
queryTMP := fmt.Sprintf(queryTPL, table)
// 这里最好使用 Prepare 将查询语句准备为语句
res, err := k.db.Query(queryTMP)
if err != nil {
return -1
}
if res.Next() {
var count int
res.Scan(&count)
result += count
}
}
return result
}