【问题标题】:Can not create oracle regexp constraint using knex无法使用 knex 创建 oracle 正则表达式约束
【发布时间】:2023-03-10 09:45:01
【问题描述】:

我正在尝试在 oracle 数据库上使用 knex 使用正则表达式创建约束。 Knex 在 oracle 列上创建约束,但它替换了“?”使用“:1”、“:2”等占位符。 我试图用“\?”替换问号(根据文档)。它在 oracle db 上对我不起作用。 这是一个oracle列约束的例子

 knex.raw('ALTER TABLE atest ADD CONSTRAINT C_TEST CHECK (REGEXP_LIKE(COL_A, \'^((([A]{0,4})WW)|(W{0,2}))\\?([B]{5}WW)+((([C]{5})W\\?))$\'))');

【问题讨论】:

  • 给出这个 regexp_like 的示例模式
  • 模式示例^((([A]{0,4})WW)|(W{0,2}))\\?([B]{5}WW)+( (([C]{5})W\\?))$' 但任何其他模式包含 ?当通过 knex 迁移脚本添加约束时,将在约束中不起作用

标签: node.js oracle knex.js


【解决方案1】:

恭喜!看起来您在 knex (https://runkit.com/embed/qlo6re5ixn4s) 中发现了一个错误。奇怪的是测试没有抓到这个。请在 knex 的 github 中打开错误报告。

虽然如果数据库在查询的那个位置接受值绑定,你可以试试这个:

knex.raw(
  'ALTER TABLE atest ADD CONSTRAINT C_TEST CHECK (REGEXP_LIKE(COL_A, ?))', 
  ['^((([A]{0,4})WW)|(W{0,2}))?([B]{5}WW)+((([C]{5})W?))$']
);

【讨论】:

  • 我已经报告了这个问题github.com/knex/knex/issues/3823
  • @Mikeal 你的行会抛出一个错误,在 DDL 中没有使用绑定的能力 :D 我已经检查过了 :)
  • 那么我想到的唯一方法(knex 不正式支持)是手动获取数据库驱动程序的连接并直接使用它来运行查询......像这样:stackoverflow.com/questions/59949825/… 除了将连接传递给 knex 直接使用它来执行查询。
猜你喜欢
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 2017-06-16
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多