regex - 触发器中的 Postgres 正则表达式匹配不正确

标签 regex postgresql rspec-rails

我有一个带有正则表达式检查的 INSERT 触发器,它没有返回我预期的结果...但在触发器中运行时。从我的 SQL 编辑器运行时,它按预期工作。

触发代码失败(我添加了 RAISE 来解决问题,我试图开始工作的代码是下面的 IF 语句):

RAISE EXCEPTION 'postal_code regex check %', '55555' !~* '^\d{5}$';
IF NEW.postal_code !~* '^\d{5}$' THEN
  errors := ARRAY_APPEND(errors, 'Postal code format is invalid.');
END IF;

这是抛出的异常(我希望 tf):

 # --- Caused by: ---
 # PG::RaiseException:
 #   ERROR:  postal_code regex check t

如果我直接在我的 SQL 编辑器中运行它:

select '55555' !~* '^\d{5}$';

它按预期返回 false

Postgres 9.6

更新:我试图找出这个问题,但无法通过以下方式重现(如果这显示了问题,select count(*) 应该返回 0 但它返回了 1):

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table (
    postal_code varchar
);

CREATE OR REPLACE FUNCTION validate_postal_code() RETURNS trigger
    LANGUAGE plpgsql
    AS $_$
        DECLARE

        BEGIN
          IF NEW.postal_code !~* '^\d{5}$' THEN
            RETURN false;
          END IF;

          RETURN NEW;
        END;
      $_$;

DROP TRIGGER IF EXISTS validate_postal_code_trigger on my_table;
CREATE TRIGGER validate_postal_code_trigger BEFORE INSERT ON my_table FOR EACH ROW EXECUTE PROCEDURE validate_postal_code();

insert into my_table values ('55555');

select count(*) from my_table;

最佳答案

问题是添加触发器的 Rails 迁移从正则表达式中删除了反斜杠。

在迁移中使用此语法:

sql = <<-SQL
  CREATE OR REPLACE FUNCTION validate_postal_code() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
        DECLARE

        BEGIN
          IF NEW.postal_code !~ '^\d{5}$' THEN
            RAISE EXCEPTION 'Debug--> postal_code regex check %, %, %', NEW.postal_code !~* '^\d{5}$', TG_OP, NEW.postal_code;
          END IF;
          RETURN NEW;
        END;
      $$;

  DROP TRIGGER IF EXISTS validate_postal_code_trigger on my_table;
  CREATE TRIGGER validate_postal_code_trigger BEFORE INSERT ON my_table 
  FOR EACH ROW EXECUTE PROCEDURE validate_postal_code();
SQL

execute sql

在 Rails 迁移中,我删除了正则表达式中的反斜杠。应用于数据库的实际正则表达式是 '^d{5}$'(缺少反斜杠)而不是 '^\d{5}$'

关于regex - 触发器中的 Postgres 正则表达式匹配不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46244361/

相关文章:

java - 通过不是字符串的开头来匹配正则表达式?

regex - Telegraf 解析 Logstash 风格的 "grok"模式

xml - 使用 groovy 更新 xml 文件时保留格式

PostgreSQL 数据库存储过程

postgresql - 将 `postgres -D/usr/local/var/postgres` 放入终端时返回此结果

ruby-on-rails-3 - Rails Phantomjs、poltergeist 和 Capybara 不能很好地配合

javascript - 如何做 replaceAll?

postgresql - 什么时候应该在没有时区的情况下创建 PostgreSQL 时间戳?

ruby-on-rails - Rspec - 访问魔法方法/变量

ruby-on-rails - 具有多态关联的 Rails 4.2.6 FactoryGirl