将 MySQL 变量查询转换为 PostgreSQL

Convert MySQL Variable Query to PostgreSQL

我已将 MYSQL 数据库迁移到 PostgreSQL,现在我正在转换我的查询以匹配。我在 Python 文件中有这个 MySQL 查询:

SET @Drop_Stm = CONCAT('DROP TABLE ', (SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables 
FROM information_schema.tables 
WHERE TABLE_NAME LIKE 'temp_%' AND TABLE_SCHEMA = '{client_name}'))

我想让它在 Postgres 中运行,我尝试了以下但 returns 错误:

WITH Drop_Stm AS (CONCAT('DROP TABLE ', (SELECT STRING_AGG(TABLE_NAME, ',') AS All_Tables 
FROM information_schema.tables 
WHERE TABLE_NAME LIKE 'temp_%' AND TABLE_SCHEMA = '{client_name}')))

LINE 1: WITH Drop_Stm AS (CONCAT('DROP TABLE ', (SELECT STRING_AGG(T...
                      ^

我也试过 DECLARE、SET 和 DO $$ .. END $$ 但没有成功

查询本身应更改为:

select concat('drop table ', string_agg(format('%I.%I', table_schema, table_name), ','), ' cascade;')
FROM information_schema.tables 
WHERE TABLE_NAME LIKE 'temp_%' 
  AND TABLE_SCHEMA = '{client_name}'

请注意,我使用 format() 函数来正确处理需要引用的标识符。我还生成了一个完全限定的 table 名称(包括架构),这样您就不会在当前架构中意外删除 table,而不是 {client_name}.

如果你想运行生成的脚本,我看到两个选项。一种是将其放入 PL/pgSQL 块并使用 execute:

do
$$
declare
  l_stmt text;
begin
  select concat('drop table ', string_agg(format('%I.%I', table_schema, table_name), ','), ' cascade;')
    into l_stmt
  FROM information_schema.tables 
  WHERE TABLE_NAME LIKE 'temp_%' 
    AND TABLE_SCHEMA = '{client_name}';
  
  execute l_stmt;
end;
$$
;

我不知道 Python,所以我不完全确定 {client_name} 是否被该方法正确替换。

另一种选择是 运行 Python 中的 SELECT 查询,并将结果存储到 Python 变量中,然后 运行 即 SQL 通过 Python.