我学习ai不会一下把这么大的问题交给它。
会把一个细节交给它,比如,已经有了一个oracle的模板系统,我会问ai,在sqlite里,怎样读出表结构?学会这个,就能够把oracle的读表结构改成sqlite的。
也可以让ai帮我把oracle的日期时间格式处理器改成sqlite的。总之,是让他做一些原子性的工作,把原子组装成分子,细胞,组织,器官,都是我的事。
SQLite 查看表结构、主键、字段、索引完整方法
一、最常用:PRAGMA table_info(表名)
语法
sql
PRAGMA table_info(表名);
返回字段说明
表格
cid name type notnull dflt_value pk
cid:字段序号
name:字段名
type:字段类型
notnull:1=非空,0=允许空
dflt_value:默认值
pk:1=主键字段,0=普通字段
示例
sql
PRAGMA table_info(user);
联合主键:pk列会有多行1,代表多个主键字段
二、查看主键完整约束(包含联合主键、外键)
1. PRAGMA foreign_key_list(表名) 查看外键
sql
PRAGMA foreign_key_list(user);
2. 读取sqlite_master系统表(查看建表SQL,完整主键、约束)
SQLite所有表、索引、视图的建表语句都存在系统表 sqlite_master
sql
-- 查看表完整建表语句(包含主键、联合主键、唯一约束)
SELECT sql FROM sqlite_master WHERE type='table' AND name='user';
返回的 sql 字段就是完整 CREATE TABLE 语句,直接看到 PRIMARY KEY 定义。
三、查看表索引(主键默认会自动创建唯一索引)
sql
PRAGMA index_list(表名);
主键对应的索引, origin 字段为 pk ,可区分主键索引和普通索引。
四、完整查询:一键获取表字段+主键标记
sql
SELECT
cid,
name AS 字段名,
type AS 字段类型,
CASE notnull WHEN 1 THEN '是' ELSE '否' END AS 非空,
dflt_value AS 默认值,
CASE pk WHEN 1 THEN '主键' ELSE '普通字段' END AS 主键标识
FROM pragma_table_info('user');
五、Navicat/DBeaver可视化工具快速查看
右键表 → 设计表/结构,直观看到主键、字段、约束
快捷键:SQLite可视化工具自带【表结构】面板
总结使用场景
快速看字段、主键标记: PRAGMA table_info(表名)
查看完整建表语句、联合主键、外键约束: SELECT sql FROM sqlite_master
查看主键自动生成的索引: PRAGMA index_list(表名)
有这些就SQLite 获取主键字段顺序(联合主键先后次序)
核心原理
pragma_table_info 返回的 pk 字段数值,直接代表主键排序优先级:
- pk=1 :联合主键第1列(最优先)
- pk=2 :联合主键第2列
- pk=3 :联合主键第3列
单列主键只会出现 pk=1
方案1:SQL一键查询主键顺序(推荐,SQLite3.16+)
sql
-- 取出所有主键字段,按主键排序优先级升序(1→2→3)
SELECT
pk AS 主键排序号,
name AS 字段名,
type AS 字段类型
FROM pragma_table_info('你的表名')
WHERE pk > 0
ORDER BY pk ASC;
示例效果
表联合主键 (user_id, order_id) ,查询结果:
表格
主键排序号 字段名 字段类型
1 user_id INTEGER
2 order_id TEXT
方案2:SQLite命令行 PRAGMA 原生语句
sql
PRAGMA table_info(你的表名);
结果里 pk 列数字越大,主键排序越靠后;手动筛选 pk>0 的行,按 pk 从小到大排列就是主键先后顺序。
方案3:查看完整建表语句(直观看到主键书写顺序)
sql
SELECT sql FROM sqlite_master WHERE type='table' AND name='你的表名';
CREATE TABLE 语句内 PRIMARY KEY(col1, col2, col3) 括号内书写顺序 = 数据库主键排序顺序。
方案4:通过索引元数据获取主键顺序(底层方案)
主键会自动生成内置索引 sqlite_autoindex_表名_1
sql
-- 拿到主键索引的字段顺序
PRAGMA index_info(sqlite_autoindex_你的表名_1);
返回 seqno 字段: seqno=0 第一主键、 seqno=1 第二主键,完美对应联合主键次序。
常用完整脚本(表结构+主键顺序合并)
sql
-- 全表字段结构,附带主键优先级标记
SELECT
cid,
name 字段名,
type 字段类型,
CASE notnull WHEN 1 THEN '是' ELSE '否' END 非空,
dflt_value 默认值,
CASE pk WHEN 0 THEN '普通字段' ELSE '主键第'||pk||'位' END 主键标识
FROM pragma_table_info('user')
ORDER BY cid;
总结使用场景
程序代码自动读取主键顺序:用方案1 pragma_table_info + ORDER BY pk
SQLite 获取主键字段顺序(联合主键先后次序)
核心原理
pragma_table_info 返回的 pk 字段数值,直接代表主键排序优先级:
- pk=1 :联合主键第1列(最优先)
- pk=2 :联合主键第2列
- pk=3 :联合主键第3列
单列主键只会出现 pk=1
方案1:SQL一键查询主键顺序(推荐,SQLite3.16+)
sql
-- 取出所有主键字段,按主键排序优先级升序(1→2→3)
SELECT
pk AS 主键排序号,
name AS 字段名,
type AS 字段类型
FROM pragma_table_info('你的表名')
WHERE pk > 0
ORDER BY pk ASC;
示例效果
表联合主键 (user_id, order_id) ,查询结果:
表格
主键排序号 字段名 字段类型
1 user_id INTEGER
2 order_id TEXT
方案2:SQLite命令行 PRAGMA 原生语句
sql
PRAGMA table_info(你的表名);
结果里 pk 列数字越大,主键排序越靠后;手动筛选 pk>0 的行,按 pk 从小到大排列就是主键先后顺序。
方案3:查看完整建表语句(直观看到主键书写顺序)
sql
SELECT sql FROM sqlite_master WHERE type='table' AND name='你的表名';
CREATE TABLE 语句内 PRIMARY KEY(col1, col2, col3) 括号内书写顺序 = 数据库主键排序顺序。
方案4:通过索引元数据获取主键顺序(底层方案)
主键会自动生成内置索引 sqlite_autoindex_表名_1
sql
-- 拿到主键索引的字段顺序
PRAGMA index_info(sqlite_autoindex_你的表名_1);
返回 seqno 字段: seqno=0 第一主键、 seqno=1 第二主键,完美对应联合主键次序。
常用完整脚本(表结构+主键顺序合并)
sql
-- 全表字段结构,附带主键优先级标记
SELECT
cid,
name 字段名,
type 字段类型,
CASE notnull WHEN 1 THEN '是' ELSE '否' END 非空,
dflt_value 默认值,
CASE pk WHEN 0 THEN '普通字段' ELSE '主键第'||pk||'位' END 主键标识
FROM pragma_table_info('user')
ORDER BY cid;
总结使用场景
程序代码自动读取主键顺序:用方案1 pragma_table_info + ORDER BY pk
快速肉眼核对主键顺序:方案3 sqlite_master 建表语句
底层校验主键索引字段:方案4 index_info
快速肉眼核对主键顺序:方案3 sqlite_master 建表语句
底层校验主键索引字段:方案4 index_info棒拉,oracle的模板系统很容易改sqlite啦!
【 在 yuanmo 的大作中提到: 】
: 给AI的指令:
: --------
: 我需要做个简洁的ORM,你先给我写一个最简版本的示例,输入一批带不同类型的字段数据(JSON格式),比如姓名、年龄、出生日期、注册时间。你可以动态分析出数据库字段,并创建SQL表格,输入数据入库。然后再从数据库中获取这些数据,并映射输出到C++类型。这里的核心是,你实现的时候并不知道表结构,也不知道JSON代表的数据结构。一切都是动态的,数据结构以JSON数据结构为准。设计的关键是要优美,其次运行时要高效。程序只写在一个C++里面,控制篇幅。SQL用SQLite。
: ...................
--
修改:ylh1969 FROM 221.221.54.*
FROM 221.221.54.*