代码之家  ›  专栏  ›  技术社区  ›  Donato Azevedo

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

  •  0
  • Donato Azevedo  · 技术社区  · 7 年前

    我是一个长生不老药/凤凰城的新手,试图找出基本知识,这样我就可以跟上速度。我很难理解以下模式定义的错误是什么,这使得生成的查询不正确。

    旁注:我正在使用Tds。用于访问只读MS SQL Server 2005数据库的EXTO适配器。

    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 回复  |  直到 7 年前
        1
  •  1
  •   Dogbert    7 年前

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

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

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