生成的查询中出现Elixir Phoenix错误

时间:2017-12-16 10:49:26

标签: elixir phoenix-framework ecto

我是一个灵丹妙药/凤凰新手试图找出基础知识,以便我能够加快速度。我很难理解以下架构定义的错误导致生成的查询不正确。

附注:我使用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)> 

1 个答案:

答案 0 :(得分:1)

将单引号更改为double应该有效:

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

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