【问题标题】:Sqlite3 Update with parameter in HaskellSqlite3 使用 Haskell 中的参数更新
【发布时间】:2016-05-16 17:09:53
【问题描述】:

最近我开始在 haskell 中使用 sqlite3,我想知道如何修改表中的变量,参数为偏移量?

我想做这样的事情:

execute_ conn "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, v INTEGER)"

execute conn "INSERT INTO test (v) VALUES (?)" (Only ("1" :: String))

execute conn "UPDATE test SET v = v + ?" (Only modifyingValue) <--- this is not working

谢谢。

【问题讨论】:

  • 错误信息是什么?是编译器错误还是运行时错误?
  • 这是一个运行时错误:SQLite3 在尝试执行准备“UPDATE test SET v = ?”时返回了 ErrorMisuse:库例程调用顺序错误

标签: database haskell sqlite sql-update


【解决方案1】:

这是有关 ErrorMisuse 错误的信息:

https://www.sqlite.org/cvstrac/wiki?p=LibraryRoutineCalledOutOfSequence

也许连接已经关闭?还是您在两个不同的线程中使用相同的连接?

这是一些有效的示例代码:

{-# LANGUAGE OverloadedStrings #-}

import           Control.Applicative
import qualified Data.Text as T
import           Database.SQLite.Simple
import           Database.SQLite.Simple.FromRow

dumpTable conn table = do
  r <- query_ conn "SELECT * from test" :: IO [(Int,String,Int)]
  mapM_ print r

main :: IO ()
main = do
  conn <- open "test.db"
  execute_ conn "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, firstname TEXT, pets INTEGER)"
  execute conn "INSERT INTO test (firstname, pets) VALUES (?,?)"
               ("Alice" :: String, 2 :: Int)
  execute conn "INSERT INTO test (firstname, pets) VALUES (?,?)"
               ("Bob" :: String, 3 :: Int) 
  putStrLn "before:"
  dumpTable conn "test"
  execute conn "UPDATE TEST SET pets = pets + ?" (Only (4 :: Int))
  putStrLn "after:"
  dumpTable conn "test"
  close conn

【讨论】:

  • 是的,我在 3 个线程中使用连接,因为我的程序的目的是测试 sqlite 是否是单线程的。如果这是错误的原因,那么我的测试似乎证明了 sqlite 不是多线程的。谢谢:D
  • 每个连接都是单线程的,但是sqlite允许并发访问和更新,所以只需为每个线程打开一个新的连接。
猜你喜欢
  • 1970-01-01
  • 2018-04-12
  • 2016-02-21
  • 1970-01-01
  • 2013-12-09
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
相关资源
最近更新 更多