如何在Ecto中编写相关子查询
例如,什么等同于SQL SELECT查询:
--Heaviest Lemmings per Group
SELECT ld.group_name, ld.id, ld.name, ld.weight
FROM lemming_data ld
WHERE weight = (
SELECT max(weight)
FROM lemming_data
WHERE group = ld.group_name
);
在Ecto语法中?我不确定如何引用外部查询的group_name。
当Ecto查询变得更复杂,需要像CASE...WHEN...ELSE...END这样的子句时,我们倾向于依赖Ecto的fragment来解决它。
例如query = from t in <Model>, select: fragment("SUM(CASE WHEN status = ? THEN 1 ELSE 0 END)", 2)
实际上,建议创建这样一个宏:
defmacro case_when(condition, do: then_expr, else: else_expr) do
quote do
fragment(
"C
我需要使用Ecto进行以下SQL查询:
SELECT users.*, (select count(0) from money_transactions where from_id = users.id AND created_at > '2016-1-25 0:00:00.000000') as money_transactions_today_db FROM "users" WHERE "users"."client_token" = '123'
我试着这样做,但它不起作用:
query = from u
我需要用Ecto实现以下查询,但是它不会编译子查询语句不是有效的表达式。
query = from p in Passphrase,
left_join: pi in PassphraseInvalidation, on: p.id == pi.target_passphrase_id,
join: u in User, on: p.user_id == u.id,
where: p.passkey == ^passkey and
is_nil(pi.inserted_at) and
p
当我尝试设置一个新的ecto repo时,我得到了以下异常。目前只使用它进行测试(因为我只是设置它)。 ** (RuntimeError) could not lookup Ecto repo Lipwig.AnnotatedUnit.Repo because it was not started or it does not exist 当我的测试使用Lipwig.AnnotatedUnit.DataCase时,就会发生这种情况。但是,当我使用Lipwig.DataCase (它引用Lipwig.Repo`)时,测试运行得很好。 我在项目中有以下设置。 defmodule Lipwig.R
我试图使用仅附加语义的Ecto表查询,因此我希望获得给定ID的完整行的最新版本。技术是,但简而言之:我希望使用子查询连接表本身,该子查询获取ID的最新时间。
SELECT r.*
FROM rules AS r
JOIN (
SELECT id, MAX(inserted_at) AS inserted_at FROM rules GROUP BY id
) AS recent_rules
ON (
recent_rules.id = r.id
AND recent_rules.inserted_at = r.inserted_at)
我很难用经济学来解释这件事。我试过这样的方法:
我刚开始使用Ecto和药剂,我遇到了一个我无法解释的错误。我的代码看起来就像Ecto中的示例。
以下是Ecto模型和查询的模块
defmodule Registration do
use Ecto.Model
schema "registrations" do
field :user_id, :string
field :created_at, :datetime, default: Ecto.DateTime.local
field :updated_at, :datetime, default: Ecto.DateTime.local
与灵丹妙药中的其他函数一样(以及Ecto自己的事务),我希望使用模式匹配来处理Ecto查询中可能出现的错误。如下所示:
case Repo.get!(User, id) do
{:ok, user} ->
#do something
{:error, message} ->
#pass the error
end
显然,这不起作用,但是我的模式如何匹配像Ecto.NotSingleResult这样的Ecto错误和其他潜在的查询问题(比如预加载错误)?
在针对Postgres (13.6)运行的Ecto查询中,我需要将I列表插入到fragment中--这通常不是我有问题的东西,但在本例中,I列表被接收为需要转换为整数的字符串列表(或者更具体地说,是BIGINT)。我认为我需要的查询如下所示,该查询的麻烦点是ANY(ARRAY?::BIGINT[])
ModelA
|> where(
[ma],
fragment(
"EXISTS (SELECT * FROM model_b mb WHERE mb.a_id = ? AND mb.c_id = ANY(ARRAY?::BIGINT[]))",
a.
我在灵丹妙药和菲尼克斯框架的世界里很新。我试图学习TheFireHoseProject教程,但在使用Ecto查询原始SQL时遇到了问题。本教程说,这应该是可行的:
defmodule Queries do
def random do
query = Ecto.Adapters.Postgres.query(
Repo,
"SELECT id, saying, author from quotes ORDER BY RANDOM() LIMIT 1",
[])
%Postgrex.Result{rows: [row]} = query
{id,
我不得不问这个问题,这是个玩笑,但还不清楚最好的办法是什么。所以这可能会变成一种小小的咆哮。但我有一种药在这里严重缺乏的祭祀。
我发现在Ecto中查询当前日期非常复杂,而不是当前日期。例如,对于像get me every record where date column x contains a date before t这样的东西。
到目前为止,我使用Erlangs :calendar.universal_time(),将其传递给Ecto.DateTime.from_erl,然后再传递给Ecto.Date.cast。
date = :calendar.universal_time() |&g
我对Elixir/Phoenix/Ecto不熟悉。我使用ecto.migration创建了一个具有4个不同模式的数据库。这些表是正确创建的,但是当我尝试查询这些表时,ecto找不到它们。
ERROR 42P01 (undefined_table): relation "users" does not exist
我知道这个问题是与数据库模式相关的,因为当我在默认模式中创建users表时,ecto可以毫不费力地找到它。
这是我尝试过的。
date = Ecto.DateTime.from_erl(:calendar.universal_time())
query |> where([record], record.deadline >= ^date)
我也试过
date = Ecto.DateTime.from_erl(:calendar.universal_time())
query = from m in MyApp.SomeModel,
where: m.deadline >= ^date,
select: m
两个都返回相同的消息
value `%Ecto.D
我正在学习本教程
但我有个问题,我不知道怎么解决。我想这跟波斯特格雷斯有关。
我做了:
$ mix ecto.create
$ mix ecto.migrate
C:\Users\999\Documents\elixir_files\blog>mix ecto.create
** (RuntimeError) could not find executable `psql` in path, please guarantee it is available before running ecto commands
lib/ecto/adapters/postgres.e
我需要通过Ecto在左侧联接中提示一个MySQL索引,这是相当困难的。
我得到的最接近的是:
query = from(s in Dossier.School,
left_join: sc in fragment("subscription_coordinators use index (subscription_coordinators_school_products_idx)"),
on: fragment("school_id = ?", 1)
and fragment("product in ('readi
我正在使用凤凰web框架(Elixir)重写基于python的API交付服务,并且遇到了一个小问题。
我正在尝试创建一个基本的模型方法,在这个方法中,当您被调用时,您传递给它一个序列号,它通过Ecto查询数据库并返回结果。纵观文档,我应该能够使用插值来定义查询中的变量,但我仍然会收到一个错误。
lib/test_result.ex文件
defmodule Webservices.TestResult do
use Ecto.Schema
schema "test_result" do
field :date_added, Ecto.Da
在ecto里我可以写
query = from q in CustomerModel, where: like(q.id, "%1")
#Ecto.Query<from c in Qber.V1.CustomerModel, where: like(c.id, "%1")>
当我运行这个查询时
(undefined_function): operator does not exist: integer ~~ unknown
从这个中,我得到了这样的想法:在应用(比如在ID上的)之前,我必须先转换。因此,在Postgres中,我可以简单地将这个查询写成
此Ecto查询工作:
bid_players = from a in Auction,
where: a.id == 1,
join: bids in assoc(a, :bids),
join: player in assoc(bids, :player),
select: player.id
这个查询的工作原理是:
players = from player in Player,
where: player.year_range == ^a
为了在Postgres中执行查询,我有一个使用Ecto的药剂应用程序。我有一个Ecto模式:
defmodule Person do
use Ecto.Schema
schema "person" do
field :name, :string
end
end
我试着在药剂中做一个简单的选择:
query = from Person
result = Repo.all(query)
但是在执行了该代码之后,我看到如下:
** (FunctionClauseError) no function clause matching in Ecto.Adapte
在Elixir中,使用引脚操作符来防止变量重新绑定。但是,对于Ecto查询,如
from u in User, where: u.username == ^username
编程凤凰城的作者(在第七章)
记住,^运算符(称为引脚运算符)意味着我们希望^用户名保持不变。
但是这听起来不对,因为很明显,查询中的比较不会导致变量的任何重新绑定。
这本书的作者(何塞·瓦利姆和他合著)是不是弄错了?Ecto查询中的pin操作符仅仅是Ecto的一个构造,而不是通常的Elixir运算符吗?或者在宏展开之后,查询真的有机会重新绑定username吗?
Ecto.Adapters.SQL.query(Repo, "Select * from table", [])似乎执行查询并返回数据。是否有一种方法可以基于原始sql定义查询,以便将其作为参数传递给Repo.all()?
我在找类似的东西,
qry = Ecto.Adapters.SQL.query("select * from table", []) # This doesn't work
Repo.all(qry)
我需要将以下SQL转换为Ecto查询DSL。
SELECT otc.*
FROM users u
INNER JOIN one_time_codes otc ON u.id = otc.user_id
LEFT OUTER JOIN one_time_code_invalidations otci ON otci.one_time_code_id = otc.id
WHERE u.id = 3 AND
otc.code = 482693 AND
otci.inserted_at IS NULL AND
otc.inserted_at > all(SEL
job模式如下所示:
schema "jobs" do
# more fields and associations
field :fulfilled, :boolean, virtual: true
end
我有需要正常工作的SQL:
SELECT jobs.*, (SELECT COUNT(1) = 0
AS fulfilled
FROM slots
JOIN slot_groups on slots.slot_group_id = slot_groups.id
我使用的是Ecto 2.0.0-rc.4,我已经完成了这个没有工作的查询。
def users do
Repo.all(
from u in User,
where: u.id == "93fd15fb-fe21-4a59-813d-f80447417a23",
select: u
)
end
id是数据库中的一个,它显示的错误是
** (Postgrex.Error) ERROR (character_not_in_repertoire): invalid byte sequence for encoding "UTF8": 0