无法使用 ecto 在 redshift 中创建模式迁移表

Posted

技术标签:

【中文标题】无法使用 ecto 在 redshift 中创建模式迁移表【英文标题】:Cannot create schema migrations table in redshift with ecto 【发布时间】:2019-09-24 08:17:00 【问题描述】:

我有一个数据库是 redshift 的项目,我在我的 phoenix 项目中使用 Postgrex 适配器,我在本地使用 postgresql,一切正常,但是当我部署并尝试运行迁移时,我收到了这个错误.

15:39:27.201 [error] Could not create schema migrations table. This error usually happens due to the following:

  * The database does not exist
  * The "schema_migrations" table, which Ecto uses for managing
    migrations, was defined by another library
  * There is a deadlock while migrating (such as using concurrent
    indexes with a migration_lock)

To fix the first issue, run "mix ecto.create".

To address the second, you can run "mix ecto.drop" followed by
"mix ecto.create". Alternatively you may configure Ecto to use
another table for managing migrations:

    config :my_service, MyService.Repo,
      migration_source: "some_other_table_for_schema_migrations"

The full error report is shown below.

▸  Given the following expression: Elixir.MyService.StartupTasks.init()
▸  The remote call failed with:
▸  ** (exit) %Postgrex.Errorconnection_id: 5598, message: nil, postgres: %code: :feature_not_supported, file: "/home/ec2-user/padb/src/pg/src/backend/commands/tablecmds.c", line: "3690", message: "timestamp or timestamp with time zone column do not support precision.", pg_code: "0A000", routine: "xen_type_size_from_attr", severity: "ERROR", query: nil
▸      (ecto_sql) lib/ecto/adapters/sql.ex:629: Ecto.Adapters.SQL.raise_sql_call_error/1
▸      (elixir) lib/enum.ex:1336: Enum."-map/2-lists^map/1-0-"/2
▸      (ecto_sql) lib/ecto/adapters/sql.ex:716: Ecto.Adapters.SQL.execute_ddl/4
▸      (ecto_sql) lib/ecto/migrator.ex:633: Ecto.Migrator.verbose_schema_migration/3
▸      (ecto_sql) lib/ecto/migrator.ex:477: Ecto.Migrator.lock_for_migrations/4
▸      (ecto_sql) lib/ecto/migrator.ex:401: Ecto.Migrator.run/4
▸      (my_service) lib/my_service/startup_tasks.ex:11: MyService.StartupTasks.migrate/0
▸      (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6

redshift 似乎不支持 postgres 支持的某些数据类型,那么有没有更好的方法来解决这个问题,或者我可以创建自己的带有另一个时间戳的架构迁移表吗?

【问题讨论】:

【参考方案1】:

驱动程序无法输出的限制,因为与 postgres 数据库相比工作原理不同,here 是 ecto 适配器的文档。

在文档中说明:

我们强烈建议您阅读 AWS 的 Designing Tables 部分 Redshift 文档。

如果你想继续在本地使用 postgres,那么你需要创建 2 个单独的 repos 和分别迁移。 Here 是可用于迁移单独 repo 的命令。

不过,我建议获取 redshift 的开发实例并将其用于开发,因为使用 redshift 等数据库的方法不同,您很容易出错。

【讨论】:

这是一个不同的适配器,这是 redshift_ecto 而不是 postgrex hexdocs.pm/redshift_ecto/RedshiftEcto.html It uses Postgrex for communicating to the database and a connection pool 是的,我不确定是否要添加此依赖项,因为该项目去年没有更新。 这很大程度上取决于您使用的ecto版本,该库有2个文件,您可以查看它们并决定是否添加。

以上是关于无法使用 ecto 在 redshift 中创建模式迁移表的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 SQL Workbench/J 在 Amazon Redshift 中创建新用户

无法在 Redshift Aginity 和 aginity pro 中创建存储过程

我无法使用 ecto 的 `over/2` 函数在窗口中添加特定的 frame_clause

使用 Amazon Redshift 进行维度建模是不是可行

无法使用 aws nodejs sdk 创建 Redshift 表

无法连接到 aws redshift