【问题标题】:Passing list of values to SELECT PostgreSQL query in Haskell将值列表传递给 Haskell 中的 SELECT PostgreSQL 查询
【发布时间】:2021-06-07 22:27:29
【问题描述】:

我正在用 Haskell 研究 PostgreSQL 和这个库:https://hackage.haskell.org/package/postgresql-simple-0.4.10.0/docs/Database-PostgreSQL-Simple.html#v:query

虽然我可以像这样选择用户:

  (query_ conn "SELECT * FROM users WHERE NAME == john" :: IO [Only Int]) >>= mapM_ print

使用query_:

query_ :: FromRow r => Connection -> Query -> IO [r]

我想我应该使用query:

query :: (ToRow q, FromRow r) => Connection -> Query -> q -> IO [r]

传递一个值列表。但是,如何通过此列表?

例如,对于INSERT,我可以这样做:

(execute conn "INSERT INTO users (NAME, PASSWORD) VALUES (?,?)") (["john", "123456"]::[String]) >>= print

但是SELECT 的等价物是什么?

【问题讨论】:

  • 没有关于你想用 SELECT 做什么的例子,但是你应该使用query,就像你使用execute一样——通常你会通过一个元组的值应该放在 ? 参数中 - 列表更适合 In 这样的组合器 - 你可以添加你想要查询的 SELECT-Statement 吗?

标签: postgresql haskell


【解决方案1】:

我不确定我是否理解你的问题,因为你问的是列表,我看不出它们是如何进入图片的。但是您的选择查询的参数化版本是这样的:

query conn "SELECT * FROM users where NAME == ?" (Only ("john" :: String))

【讨论】:

  • 为什么对execute conn "drop table if exists ?" (Only ("users"::String))SqlError {sqlState = "42601", sqlExecStatus = FatalError, sqlErrorMsg = "syntax error at or near \"'users'\"", sqlErrorDetail = "", sqlErrorHint = ""} 不起作用?
  • @GuerlandoOCs 因为Strings 被引用以生成 SQL 字符串。该查询在替换后变为drop table if exists 'users',而不是您希望的drop table if exists users。在图书馆的新类型中四处寻找——有一种可以在不引用的情况下包含内容。 (我会链接到它,但 Hackage 目前已关闭。)也就是说……您确定您需要动态选择要删除的表吗?这听起来像是一种非常不寻常的数据库使用方式。
  • 我不需要动态库名称,我只是在测试一些东西/为什么转义适用于SELECT 而不适用于DROP
  • @GuerlandoOCs 你错了。您也无法使用select 以这种方式动态选择表。试试看:query conn "SELECT * FROM ? where NAME == 'john'" (Only ("users" :: String))。你会得到一个错误。如果您的问题是为什么它适用于 john 位,那么...因为这是一个需要 SQL 字符串的漏洞!
  • 好的,但现在我对? 的工作原理感到困惑。它仅适用于预期以动态方式填充值的情况?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2015-02-06
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多