【问题标题】:Elixir Phoenix error in generated query生成的查询中的 Elixir Phoenix 错误
【发布时间】:2017-12-16 10:49:25
【问题描述】:

我是一名长生不老药/凤凰新手,试图弄清楚基础知识,以便跟上进度。我很难理解以下架构定义有什么问题导致生成的查询不正确。

附注:我正在使用 Tds.Ecto 适配器访问只读 MS SQL Server 2005 数据库。

defmodule Rodes.Sigcdpro do
    use Ecto.Schema
    import Ecto.Changeset
    alias Rodes.Sigcdpro

    @primary_key {:cpros, :string, []}
    @derive {Phoenix.Param, key: :cpros}

    schema "sigcdpro" do
        # field :cpros, :string
        field :dpros, :string
    end

    @doc """
    Tabela de produtos
    """

    def changeset( %Sigcdpro{} = sigcdpro, attrs ) do
        sigcdpro
        |> cast( attrs, [:cpros, :dpros] )
    end
end

然后,当我在交互式 shell 上运行以下命令时,出现错误。

iex(8)> Rodes.Repo.all(from p in Rodes.Sigcdpro, where: p.cpros == 'R1156CRY.R1')
[debug] QUERY ERROR source="sigcdpro" db=227.0ms
SELECT s0.[cpros], s0.[dpros] FROM [sigcdpro] AS s0 WHERE (s0.[cpros] = 82, 49, 49, 53, 54, 67, 82, 89, 46, 82, 49) []
** (Tds.Error) Line 1 (Error 102): Incorrect syntax near ','.
    (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
iex(8)> 

【问题讨论】:

  • 试试双引号:p.cpros == "R1156CRY.R1".
  • 旁注: 发布的架构已将其 cpros 字段注释掉。此外,@Dogbert 的建议应该有效:单引号与 Elixir 中的双引号绝对不同。在所有的教程中都有很多关于它的文章,基本上'R11'一个列表,而不是一个字符串

标签: elixir phoenix-framework ecto


【解决方案1】:

将单引号改为双引号应该可以:

Rodes.Repo.all(from p in Rodes.Sigcdpro, where: p.cpros == "R1156CRY.R1")

单引号字符串是字符列表,它们是整数列表 ('foo' == [102, 111, 111])。我认为Tds.Ecto 的行为在这里不好——它应该以更好的方式处理字符列表,要么在类型不匹配时抛出适当的错误,要么以某种方式传递数组而不会导致语法错误(我不知道 MSSQL 支持什么查询)。如果尚未报告,您可能希望在他们的 repo 中报告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多