BigQuery 脚本通过联合查询将 google cloud postgres 表复制到 BigQuery

use*_*463 1 postgresql dynamic-sql google-bigquery

我有一个 google cloud postgres 实例,我正在尝试将架构中的所有表复制到单独的 google bigquery 表中,并使用运行联合查询的脚本,该脚本将安排在某个时间间隔运行。我正在使用 information_schema 中的数据,因为我希望脚本也能够选择新添加的表。

假设分析模式有 4 个表。

analytics.table1
analytics.table2
analytics.table3
analytics.table4
Run Code Online (Sandbox Code Playgroud)

下面的示例代码生成分析架构中所有表的列表,并将其设置为变量名称“table_name”。

DECLARE table_name ARRAY<STRING>;

SET table_name=(
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>",
    "select table_schema||'.'||table_name as table_name from information_schema.tables 
        where table_schema='analytics';");
);
Run Code Online (Sandbox Code Playgroud)

我对该脚本的目的是使用以下查询创建四个单独的 bigquery 表

CREATE TABLE analytics.table1 AS
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>", "SELECT * FROM analytics.table1");

CREATE TABLE analytics.table2 AS
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>", "SELECT * FROM analytics.table2");

CREATE TABLE analytics.table3 AS
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>", "SELECT * FROM analytics.table3");

CREATE TABLE analytics.table4 AS
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>", "SELECT * FROM analytics.table4");
Run Code Online (Sandbox Code Playgroud)

循环遍历表“table_name”列表以使用单独的 sql 语句创建这些表的最佳方法是什么?

Sou*_*hra 5

您可以尝试这个解决方案:

DECLARE TABLE_LIST ARRAY<STRING>;
DECLARE DSQL STRING;
DECLARE i INT64 DEFAULT 1;
DECLARE cnt INT64 DEFAULT 0;
SET TABLE_LIST = ARRAY(SELECT * FROM EXTERNAL_QUERY("connection-id", "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'analytics';"));
SET cnt = ARRAY_LENGTH(TABLE_LIST);
WHILE i <= cnt 
DO
  SET DSQL = '"SELECT * FROM analytics.' || TABLE_LIST[ORDINAL(i)] || '"';
  EXECUTE IMMEDIATE 'CREATE TABLE analytics.' || TABLE_LIST[ORDINAL(i)] || ' AS SELECT * FROM EXTERNAL_QUERY("connection-id",' || DSQL || ');';
  SET i = i + 1;
END WHILE;
Run Code Online (Sandbox Code Playgroud)