首页 > 解决方案 > 在php中替换postgres存储过程

问题描述

我面临着运行第三方软件的任务,cockroachdb而不是支持的postgresql. 我天真地认为这将是一个简单的转换,就像cockroachdbpostgresqlsuperset一样。但是,当我进行转换时,我意识到cockroachdb不支持Stored ProceduresTriggers. 有一个functions.sql文件包含Stored Procedures调用 SQL 函数的各种 php 文件。由于cockroachdb不支持存储过程,我的想法是创建模仿 SQL 文件中存储过程的 php 函数。这是我能想到的唯一解决方法,但我对 php 的了解几乎为零,因此您的专业知识会有所帮助。我假设这可以根据我对 python 的了解来完成,我可以使用 pyscopg2 库或像 SQLAlchemy 这样的 ORM。

下面是其中一个存储过程:

CREATE OR REPLACE FUNCTION date_format(
    timestamp without time zone, 
    text) 
    RETURNS text AS $$ 
    DECLARE 
    i int := 1; temp 
    text := ''; 
    c text; 
    n text; 
    res text; 
BEGIN 
    WHILE i <= pg_catalog.length($2) 
    LOOP c := SUBSTRING ($2 FROM i FOR 1); 
        IF c = '%' AND i != pg_catalog.length($2) THEN n := SUBSTRING ($2 FROM (i + 1) FOR 1); 
        SELECT INTO res CASE 
            WHEN n = 'a' THEN pg_catalog.to_char($1, 'Dy') 
            WHEN n = 'b' THEN pg_catalog.to_char($1, 'Mon') 
            WHEN n = 'c' THEN pg_catalog.to_char($1, 'FMMM') 
            WHEN n = 'D' THEN pg_catalog.to_char($1, 'FMDDth') 
            WHEN n = 'd' THEN pg_catalog.to_char($1, 'DD') 
            WHEN n = 'e' THEN pg_catalog.to_char($1, 'FMDD') 
            WHEN n = 'f' THEN pg_catalog.to_char($1, 'US') 
            WHEN n = 'H' THEN pg_catalog.to_char($1, 'HH24') 
            WHEN n = 'h' THEN pg_catalog.to_char($1, 'HH12') 
            WHEN n = 'I' THEN pg_catalog.to_char($1, 'HH12') 
            WHEN n = 'i' THEN pg_catalog.to_char($1, 'MI') 
            WHEN n = 'j' THEN pg_catalog.to_char($1, 'DDD') 
            WHEN n = 'k' THEN pg_catalog.to_char($1, 'FMHH24') 
            WHEN n = 'l' THEN pg_catalog.to_char($1, 'FMHH12') 
            WHEN n = 'M' THEN pg_catalog.to_char($1, 'FMMonth') 
            WHEN n = 'm' THEN pg_catalog.to_char($1, 'MM') 
            WHEN n = 'p' THEN pg_catalog.to_char($1, 'AM') 
            WHEN n = 'r' THEN pg_catalog.to_char($1, 'HH12:MI:SS AM') 
            WHEN n = 'S' THEN pg_catalog.to_char($1, 'SS') 
            WHEN n = 's' THEN pg_catalog.to_char($1, 'SS') 
            WHEN n = 'T' THEN pg_catalog.to_char($1, 'HH24:MI:SS') 
            WHEN n = 'U' THEN pg_catalog.to_char($1, '?') 
            WHEN n = 'u' THEN pg_catalog.to_char($1, '?') 
            WHEN n = 'V' THEN pg_catalog.to_char($1, '?') 
            WHEN n = 'v' THEN pg_catalog.to_char($1, '?') 
            WHEN n = 'W' THEN pg_catalog.to_char($1, 'FMDay') 
            WHEN n = 'w' THEN EXTRACT(DOW FROM $1)::text 
            WHEN n = 'X' THEN pg_catalog.to_char($1, '?') 
            WHEN n = 'x' THEN pg_catalog.to_char($1, '?') 
            WHEN n = 'Y' THEN pg_catalog.to_char($1, 'YYYY') 
            WHEN n = 'y' THEN pg_catalog.to_char($1, 'YY') 
            WHEN n = '%' THEN pg_catalog.to_char($1, '%') 
        ELSE NULL END; temp := temp operator(pg_catalog.||) res; i := i + 2; 
        ELSE temp = temp operator(pg_catalog.||) c; i := i + 1; 
        END IF; 
    END LOOP; 
RETURN temp; 
END $$ IMMUTABLE STRICT LANGUAGE plpgsql;

其中一个 php 文件调用该过程,如下所示:

$sql = "SELECT date_format(c.date_commande,'%m') as dm, SUM(c.".$this->field.")";

我提议的工作是否过于天真?有没有更好的方法来解决这个问题?谢谢你。

标签: phpdatabasepostgresqlcockroachdb

解决方案


我相信您使用 PHP 的方法似乎是合理的,因为我不使用 PHP 进行开发。

但是,使用 CockroachDB builtin 可能更容易experimental_strftime

见这里:https ://www.cockroachlabs.com/docs/v21.1/functions-and-operators#date-and-time-functions


推荐阅读