如何使用Knex查询数据库表及指定列的外键信息
如何通过Knex获取指定列的外键信息
Knex 内置的 columnInfo() 方法设计上仅返回列本身的基础属性(数据类型、是否允许为空、默认值等),不会返回外键这类跨表关联的约束信息,你可以通过以下两种方式查询:
方案1:直接使用Knex raw查询数据库系统表
不同数据库存储元数据的系统表存在差异,你可以根据自己使用的数据库选择对应写法:
- MySQL 场景,查询
INFORMATION_SCHEMA系统表:
const fkInfo = await knex.raw(` SELECT CONSTRAINT_NAME as fk_name, REFERENCED_TABLE_NAME as referenced_table, REFERENCED_COLUMN_NAME as referenced_column FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ? AND REFERENCED_TABLE_NAME IS NOT NULL `, ['你要查询的表名', '你要查询的列名']); // MySQL 查询结果存放在 fkInfo[0] 中
- PostgreSQL 场景,关联查询元数据表:
const fkInfo = await knex.raw(` SELECT tc.constraint_name as fk_name, ccu.table_name as referenced_table, ccu.column_name as referenced_column FROM information_schema.table_constraints tc JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name JOIN information_schema.constraint_column_usage ccu ON ccu.constraint_name = tc.constraint_name WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = ? AND kcu.column_name = ? `, ['你要查询的表名', '你要查询的列名']);
- SQLite 场景,查询
pragma信息:
const fkList = await knex.raw(`PRAGMA foreign_key_list(??)`, ['你要查询的表名']); const targetColumnFK = fkList.filter(item => item.from === '你要查询的列名');
方案2:使用封装好的Schema查询工具
如果需要兼容多数据库,不想手写不同数据库的原生查询,可以使用社区维护的 knex-schema-inspector 工具,它封装了所有主流数据库的元数据查询逻辑:
// 先安装依赖:npm install knex-schema-inspector import { createKnexSchemaInspector } from 'knex-schema-inspector'; const inspector = createKnexSchemaInspector(knex); // 获取指定表的所有外键 const allTableFK = await inspector.foreignKeys('你要查询的表名'); // 过滤出目标列对应的外键信息 const targetColumnFK = allTableFK.filter(fk => fk.columns.includes('你要查询的列名'));
查询返回的结果会包含外键名称、关联的目标表、关联的目标列、更新/删除级联规则等完整外键信息。
内容的提问来源于stack exchange,提问作者adrianthedev
相关产品推荐
相关产品推荐

