使用联合查询将 google 云 postgres 表复制到 BigQuery 的 BigQuery 脚本

BigQuery Script to replicate google cloud postgres tables to BigQuery with federated queries

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

假设分析模式有 4 个表。

analytics.table1
analytics.table2
analytics.table3
analytics.table4

我下面的示例代码生成分析模式中所有表的列表并将其设置为变量名称“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';");
);

我对这个脚本的意图是用下面的查询创建四个单独的 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");

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

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

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;