【问题标题】:How to manage schema migrations in Google BigQuery如何在 Google BigQuery 中管理架构迁移
【发布时间】:2018-08-14 05:07:57
【问题描述】:

如何管理 Google BigQuery 的架构迁移,我们过去使用过 Liquibase 和 Flyway。我们可以使用什么样的工具来管理跨开发/暂存环境的架构修改等(例如添加新列)。

【问题讨论】:

标签: google-cloud-platform google-bigquery database-migration liquibase flyway


【解决方案1】:

找到用于 BigQuery 架构迁移的开源框架

https://github.com/medjed/bigquery_migration

另一种解决方案

https://robertsahlin.com/automatic-builds-and-version-control-of-your-bigquery-views/

附言

在 flyway 中,有人打开了 ticket 以支持 BigQuery。

【讨论】:

    【解决方案2】:

    Flyway 是一种非常流行的数据库迁移工具,现在作为 测试版 提供对 BigQuery 的支持,同时等待认证。

    您可以在回答一个简短的调查后访问测试版:https://flywaydb.org/documentation/database/big-query

    我已经从命令行对其进行了测试,效果很好!我花了大约一个小时来熟悉 Flyway 的配置,现在用 yarn 命令调用它。

    这是一个 NodeJS 项目的示例,文件结构如下:

    package.json
    fireway/
        <SERVICE_ACCOUNT_JSON_FILE>
        flyway.conf
        migrations/
            V1_<YOUR_MIGRATION>.sql
    

    package.json

    {
      ...
      "scripts": {
        ...
        "migrate": "flyway -configFiles=flyway/flyway.conf migrate"
      },
      ...
    }
    

    flyway.conf

    flyway.url=jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=<YOUR_PROJECT_ID>;OAuthType=0;OAuthServiceAcctEmail=<SERVICE_ACCOUNT_NAME>;OAuthPvtKeyPath=flyway/<SERVICE_ACCOUNT_JSON_FILE>;
    
    flyway.schemas=<YOUR_DATASET_NAME>
    flyway.user=
    flyway.password=
    
    flyway.locations=filesystem:./flyway/migrations
    flyway.baselineOnMigrate=true
    

    然后,您可以随时致电yarn migrate 申请新的迁移。

    【讨论】:

      【解决方案3】:

      我为 Sequel 创建了一个适配器 sequel-bigquery,因此我们可以将 BigQuery 数据库架构作为一组使用 Sequel 的 DSL 的 Ruby 迁移文件进行管理——就像我们对 PostgreSQL 数据库所做的那样。

      示例

      # migrations/bigquery/001_create_people_table.rb
      
      Sequel.migration do
        change do
          create_table(:people) do
            String :name, null: false
            Integer :age, null: false
            TrueClass :is_developer, null: false
            DateTime :last_skied_at
            Date :date_of_birth, null: false
            BigDecimal :height_m
            Float :distance_from_sun_million_km
          end
        end
      end
      
      require 'sequel-bigquery'
      require 'logger'
      
      db = Sequel.connect(
        adapter: :bigquery,
        project: 'your-gcp-project',
        database: 'your_bigquery_dataset_name',
        location: 'australia-southeast2',
        logger: Logger.new(STDOUT),
      )
      
      Sequel.extension(:migration)
      
      Sequel::Migrator.run(db, 'migrations/bigquery')
      

      【讨论】:

        【解决方案4】:

        根据BQ docs,您可以在架构中添加一行,而无需任何额外的过程。

        对于更复杂的转换,如果可以在 SQL 查询中解决,您可以运行该查询 setting the destination table as the source table(尽管我建议 creating a backup of the table 以防出现问题)。

        示例

        假设我有一个表,其中有一列是整数(列d),但在插入时它被写为字符串。我可以通过将自身设置为目标表并运行如下查询来修改表:

        SELECT
          a,
          b,
          c,
          CAST(d AS INT64) AS d,
          e,
          f
        FROM
          `example.dataset.table`
        

        这是一个更改架构的示例,但只要您可以通过 BQ 查询获得结果,就可以应用此示例。

        【讨论】:

        • 谢谢乔弗雷。但我的问题更多是关于如何在特定环境和跨环境中管理模式迁移。由于一个表可能会经历多次更改,我们希望有一个框架(例如 liquibase 或 flyway)来管理我们的模式迁移,以便可以根据需要灵活地部署或回滚您的更改。我想知道这个产品有哪些可用的工具。
        • 我猜想使用Simba driver,您可以使用任何可以连接到 SQL DB 的工具,但从未尝试过,所以不知道效果如何。
        • 我不认为上述驱动程序也有帮助,liquibase 和 flyway 提供了一种管理迁移的机制
        猜你喜欢
        • 2017-09-08
        • 2018-12-17
        • 1970-01-01
        • 1970-01-01
        • 2016-04-12
        • 1970-01-01
        • 1970-01-01
        • 2016-07-13
        • 2020-10-03
        相关资源
        最近更新 更多