Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql elixir,Exto:无法将参数传递给";“创建视图”;原始SQL查询_Postgresql_Elixir_Ecto_Postgrex - Fatal编程技术网

Postgresql elixir,Exto:无法将参数传递给";“创建视图”;原始SQL查询

Postgresql elixir,Exto:无法将参数传递给";“创建视图”;原始SQL查询,postgresql,elixir,ecto,postgrex,Postgresql,Elixir,Ecto,Postgrex,我们正在构建一个elixir应用程序,并使用ecto连接到我们的数据库。应用程序的角色之一是基于我们的事件存储创建报告。我们决定用原始SQL编写这些报告的代码 我需要创建一个带有一些参数的临时视图。考虑下面的代码: Ecto.Adapters.SQL.query!( Repo, "CREATE VIEW events_view AS SELECT * FROM events WHERE type = $1", ["hello world"] ) # This will fail w

我们正在构建一个elixir应用程序,并使用ecto连接到我们的数据库。应用程序的角色之一是基于我们的事件存储创建报告。我们决定用原始SQL编写这些报告的代码

我需要创建一个带有一些参数的临时视图。考虑下面的代码:

Ecto.Adapters.SQL.query!(
  Repo,
  "CREATE VIEW events_view AS SELECT * FROM events WHERE type = $1",
  ["hello world"]
)

# This will fail with the following error:
# (ArgumentError) parameters must be of length 0 for query [...]
上面的代码只有一个参数,无法工作(显然是在ecto/postgrex级别)。但是,删除参数会使postgres级别的查询失败

Ecto.Adapters.SQL.query!(
  Repo,
  "CREATE VIEW events_view AS SELECT * FROM events WHERE type = $1",
  []
)

# And this will fails because Postgres complains about a missing parameter
# (Postgrex.Error) ERROR 42P02 (undefined_parameter) there is no parameter $1
我使用这种方法为大量查询传递参数,包括选择和创建表查询。然而,出于某种原因,CREATE视图似乎不接受参数


知道如何解决这个问题吗?

这是PostgreSQL的一个限制:您只能在
SELECT
INSERT
UPDATE
DELETE
语句中使用参数。对于所有其他语句,必须通过在字符串中包含值来构造语句。小心SQL注入

此限制没有文档记录,但您可以在
src/backend/parser/gram.y
中看到:

PreparableStmt:
选择STMT
|插入stmt
|更新mt
|deleteSMT/*默认情况下,所有值均为$$=$1*/
;

嘿,谢谢你的回答,你能提供一些链接供将来参考吗?我试图在文档中找到这一点,但到目前为止没有luckI添加源代码引用。