我已將 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 中作業,我嘗試了以下但回傳錯誤:
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 $$,但沒有成功
uj5u.com熱心網友回復:
查詢本身應更改為:
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()函式正確處理需要參考的識別符號。我還生成了一個完全限定的表名(包括架構),這樣您就不會意外地將表洗掉到當前架構中,而不是{client_name}.
如果你想運行生成的腳本,我看到兩個選項。一種是將其放入 PL/pgSQL 塊中并使用執行:
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 變數中,然后通過 Python 運行該 SQL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/465863.html
標籤:mysql PostgreSQL 变量
