将 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.
我已将 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.