【问题标题】:Beego migration: Create index concurrently not workingBeego迁移:同时创建索引不起作用
【发布时间】:2021-09-30 19:15:35
【问题描述】:
package main

import (
    "github.com/beego/beego/v2/client/orm/migration"
)

// DO NOT MODIFY
type AddConstraintToUser_20210928_223906 struct {
    migration.Migration
}

// DO NOT MODIFY
func init() {
    m := &AddConstraintToUser_20210928_223906{}
    m.Created = "20210928_223906"

    migration.Register("AddConstraintToUser_20210928_223906", m)
}

// Run the migrations
func (m *AddConstraintToUser_20210928_223906) Up() {
    // use m.SQL("CREATE TABLE ...") to make schema update
    m.SQL("END;" +
        "CREATE UNIQUE INDEX  CONCURRENTLY IF NOT EXISTS uniq_email ON users (email) WHERE status_id=1;" +
        "CREATE UNIQUE INDEX  CONCURRENTLY IF NOT EXISTS uniq_name ON users (name) WHERE status_id=1;" +
        "BEGIN;")
}

// Reverse the migrations
func (m *AddConstraintToUser_20210928_223906) Down() {
    // use m.SQL("DROP TABLE ...") to reverse schema update
    m.SQL("END;" +
        "DROP INDEX CONCURRENTLY IF EXISTS uniq_email;" +
        "DROP INDEX CONCURRENTLY IF EXISTS  uniq_name;" +
        "BEGIN;")
}

这是我的迁移文件。在运行bee migrate 时,它会抛出一个错误:

2021/09/29 04:26:03 INFO     ▶ 0001 Using 'postgres' as 'driver'
2021/09/29 04:26:03 INFO     ▶ 0002 Using '/Users/aashishpassrija/go/src/users/database/migrations' as 'dir'
2021/09/29 04:26:03 INFO     ▶ 0003 Running all outstanding migrations
2021/09/29 04:26:08 INFO     ▶ 0004 |> 2021/09/29 04:26:06.018 [I]  start upgrade AddConstraintToUser_20210928_223906
2021/09/29 04:26:08 INFO     ▶ 0005 |> 2021/09/29 04:26:06.018 [I]  exec sql: END;CREATE UNIQUE INDEX  CONCURRENTLY IF NOT EXISTS uniq_email ON users (email) WHERE status_id=1;CREATE UNIQUE INDEX  CONCURRENTLY IF NOT EXISTS uniq_name ON users (name) WHERE status_id=1;BEGIN;
2021/09/29 04:26:08 INFO     ▶ 0006 |> 2021/09/29 04:26:06.018 [E]  execute error: pq: CREATE INDEX CONCURRENTLY cannot run inside a transaction block
2021/09/29 04:26:08 ERROR    ▶ 0007 Could not run migration binary: exit status 2

现在我知道不能在事务中同时创建索引。但考虑到我的数据库很大。我如何实现这一目标? beego 是否有 disable_ddl_transaction 的等价物?

【问题讨论】:

    标签: postgresql go beego


    【解决方案1】:

    如果您向服务器发送多个用分号分隔的语句,它们将全部在一个事务中运行。但是你不能在多语句事务中运行CREATE INDEX CONCURRENTLY

    启用自动提交(如果禁用)并单独运行每个 CREATE INDEX CONCURRENTLY

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      相关资源
      最近更新 更多