将MySQL查询转换为Knex等效语法?

时间:2018-08-26 18:31:41

标签: mysql knex.js

我很难将特定的MySQL查询复制到Knex中(我使用书架作为ORM)。 SQL查询从数据库返回所有表的元数据。

MySQL查询

SELECT
    T.TABLE_NAME,
    C.COLUMN_NAME,
    C.COLUMN_TYPE,
    N.CONSTRAINT_TYPE,
    K.REFERENCED_TABLE_NAME,
    K.REFERENCED_COLUMN_NAME
  FROM
    INFORMATION_SCHEMA.TABLES T
    LEFT JOIN
    INFORMATION_SCHEMA.COLUMNS C USING (TABLE_SCHEMA , TABLE_NAME)
    LEFT JOIN
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE K USING (TABLE_SCHEMA , TABLE_NAME , COLUMN_NAME)
    LEFT JOIN
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS N USING (TABLE_SCHEMA , TABLE_NAME , CONSTRAINT_NAME)
  WHERE
    TABLE_TYPE = 'BASE TABLE'
    AND TABLE_SCHEMA = 'sakila'
    ORDER BY T.TABLE_NAME

此查询返回数据库的每个表与每个表的架构有关的详细信息之间的关系。我不知道使用knex进行此操作的正确方法。

我尝试使用knex编写查询,但是INFORMATION_SCHEMA.KEY_COLUMN_USAGE,INFORMATION_SCHEMA.TABLE_CONSTRAINTS是MySQL客户端非常特定的内容,但是我的用例要求我即使对于MS SQL也要使用它。而且关于knex的INFORMATION_SCHEMA用法的文档很少。

感谢您提供任何见解-非常感谢。

1 个答案:

答案 0 :(得分:0)

类似的事情可能会起作用:

knex('TABLES as T')
  .withSchema('INFORMATION_SCHEMA')
  .select(
    'T.TABLE_NAME', 
    'C.COLUMN_NAME', 
    'C.COLUMN_TYPE',
    'N.CONSTRAINT_TYPE',
    'K.REFERENCED_TABLE_NAME',
    'K.REFERENCED_COLUMN_NAME'
  )
  .join('COLUMNS as C', 
    builder => builder
     .on('T.TABLE_SCHEMA', 'C.TABLE_SCHEMA')
     .on('T.TABLE_NAME', 'C.TABLE_NAME')
  )
  ... rest of joins ...
  .where('TABLE_TYPE', 'BASE TABLE')
  .where('TABLE_SCHEMA','sakila')
  .orderBy('T.TABLE_NAME')