使用旧数据库的 Ecto 中的 bigint 与整数错误
bigint versus integer error in Ecto with Legacy database
我处于以下情况:有一个来自 Rails 应用程序的 PostgreSQL 遗留数据库,我需要与之交互。
Phoenix 正在使用带有模式的 Repo 连接到该数据库,到目前为止它似乎工作正常,我可以检索元素并执行一些具有预期结果的基本查询。
现在,我开始尝试一些高级查询,但遇到了一些我不知道如何解决的问题。例如:
from(is in acc, or_where: ^current_user.id in [is.transcriber_id, is.radiologist_id, is.validator_id])
returns下面的错误
** (Postgrex.Error) ERROR 42P08 (ambiguous_parameter): inconsistent types deduced for parameter
bigint versus integer
(ecto) lib/ecto/adapters/sql.ex:431: Ecto.Adapters.SQL.execute_and_cache/7
(ecto) lib/ecto/repo/queryable.ex:133: Ecto.Repo.Queryable.execute/5
(ecto) lib/ecto/repo/queryable.ex:37: Ecto.Repo.Queryable.all/4
经过一些研究,我发现 Rails 中的 ActiveRecord 将整数存储为 bigints
但我不确定 Postgrex 或 Ecto(我真的不知道谁负责这个)正在正确解释我在查询中使用的整数 current_user.id
。
我感觉 in [is.transcriber_id, is.radiologist_id, is.validator_id]
这个表达式有点贪心,也许我应该使用片段。
更新:
is
代表 ImagingStudy。 Rails本模型迁移如下:
class CreateImagingStudies < ActiveRecord::Migration[5.2]
def change
create_table :imaging_studies do |t|
t.string :status_name
t.bigint :validator_id
t.bigint :radiologist_id
t.bigint :transcriber_id
t.timestamps
end
end
end
操作table对应imaging_studies的Phoenix schema如下
defmodule Worklist.Studies.ImagingStudy do
use Ecto.Schema
schema "imaging_studies" do
field :transcriber_id, :integer
field :radiologist_id, :integer
field :validator_id, :integer
timestamps(inserted_at: :created_at, updated_at: :updated_at)
end
没有用户架构,因为他们是在另一项服务中管理的。考虑 current_user
具有名为 id
.
的整数字段的映射
Ecto 自愿 explicitly maps :integer
输入到 Postgres 的 :bigint
.
也就是说,通过使用具有适当类型映射的 Ecto.Query.API.type/2
one might explicitly cast the parameter to :bigint
to help ecto:
from(
is in acc,
or_where:
type(^current_user.id, :integer) in [
is.transcriber_id, is.radiologist_id, is.validator_id
]
)
我处于以下情况:有一个来自 Rails 应用程序的 PostgreSQL 遗留数据库,我需要与之交互。
Phoenix 正在使用带有模式的 Repo 连接到该数据库,到目前为止它似乎工作正常,我可以检索元素并执行一些具有预期结果的基本查询。
现在,我开始尝试一些高级查询,但遇到了一些我不知道如何解决的问题。例如:
from(is in acc, or_where: ^current_user.id in [is.transcriber_id, is.radiologist_id, is.validator_id])
returns下面的错误
** (Postgrex.Error) ERROR 42P08 (ambiguous_parameter): inconsistent types deduced for parameter
bigint versus integer
(ecto) lib/ecto/adapters/sql.ex:431: Ecto.Adapters.SQL.execute_and_cache/7
(ecto) lib/ecto/repo/queryable.ex:133: Ecto.Repo.Queryable.execute/5
(ecto) lib/ecto/repo/queryable.ex:37: Ecto.Repo.Queryable.all/4
经过一些研究,我发现 Rails 中的 ActiveRecord 将整数存储为 bigints
但我不确定 Postgrex 或 Ecto(我真的不知道谁负责这个)正在正确解释我在查询中使用的整数 current_user.id
。
我感觉 in [is.transcriber_id, is.radiologist_id, is.validator_id]
这个表达式有点贪心,也许我应该使用片段。
更新:
is
代表 ImagingStudy。 Rails本模型迁移如下:
class CreateImagingStudies < ActiveRecord::Migration[5.2]
def change
create_table :imaging_studies do |t|
t.string :status_name
t.bigint :validator_id
t.bigint :radiologist_id
t.bigint :transcriber_id
t.timestamps
end
end
end
操作table对应imaging_studies的Phoenix schema如下
defmodule Worklist.Studies.ImagingStudy do
use Ecto.Schema
schema "imaging_studies" do
field :transcriber_id, :integer
field :radiologist_id, :integer
field :validator_id, :integer
timestamps(inserted_at: :created_at, updated_at: :updated_at)
end
没有用户架构,因为他们是在另一项服务中管理的。考虑 current_user
具有名为 id
.
Ecto 自愿 explicitly maps :integer
输入到 Postgres 的 :bigint
.
也就是说,通过使用具有适当类型映射的 Ecto.Query.API.type/2
one might explicitly cast the parameter to :bigint
to help ecto:
from(
is in acc,
or_where:
type(^current_user.id, :integer) in [
is.transcriber_id, is.radiologist_id, is.validator_id
]
)