【问题标题】:Translate a MySQL query into Knex equivalent syntax?将 MySQL 查询转换为 Knex 等效语法?
【发布时间】:2018-08-26 18:31:41
【问题描述】:

我很难将特定的 MySQL 查询复制到 Knex(我使用 Bookshelf 作为 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 用法的文档并不多。

感谢任何见解 - 非常感谢。

【问题讨论】:

  • 你试过了吗?请参阅knexjs.org中的示例
  • 我试过了,但没有太多关于 knex 的 INFORMATION_SCHEMA 用法的文档。

标签: mysql knex.js


【解决方案1】:

这样的事情可能会奏效:

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')

【讨论】:

  • 感谢您的帮助,但其他联接有 INFORMATION_SCHEMA.KEY_COLUMN_USAGE、INFORMATION_SCHEMA.TABLE_CONSTRAINTS,它们对 MySQL 客户端非常特殊,但是我的用例要求我使用它,即使是 MS SQL。那么是否有一些 knex 等效的解决方案呢?
  • 我可能没有理解你的问题,但是如果你的意思是那些JOIN ... USING (TABLE_SCHEMA , TABLE_NAME , COLUMN_NAME) 风格的连接,你可以从我的例子中看到如何将它们转换为JOIN ON 子句。我看不出构建其他连接与第一个连接有何不同。
  • 问题是 REFERENCED_TABLE_NAME,在 MSSQL 中无法访问 REFERENCED_COLUMN_NAME,因此此查询将引发错误。我只是想知道是否有 knex 替代品。
  • 不,没有。 Knex 通常不会抽象出 DB 差异(非常有限的程度除外)。您还需要弄清楚如何在 mssql 中执行该查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
相关资源
最近更新 更多