Database 使用Haskell中的参数更新Sqlite3
最近,我开始在haskell中使用sqlite3,我想知道如何在表中修改参数为offset的变量 我想这样做:Database 使用Haskell中的参数更新Sqlite3,database,haskell,sqlite,sql-update,Database,Haskell,Sqlite,Sql Update,最近,我开始在haskell中使用sqlite3,我想知道如何在表中修改参数为offset的变量 我想这样做: 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 +
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
execute_uconn“如果不存在创建表测试(id INTEGER主键,v INTEGER)”
执行conn“插入测试(v)值(?)”(仅限(“1”::字符串))
执行conn“更新测试集v=v+?”(仅修改值)以下是错误误用错误的信息:
也许连接已经关闭了?或者在两个不同的线程中使用相同的连接
以下是一些有效的示例代码:
{-# 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
{-#语言重载字符串}
导入控制
导入符合条件的数据。文本为T
导入Database.SQLite.Simple
导入Database.SQLite.Simple.FromRow
dumpTable conn table=do
r以下是错误误用错误的信息:
也许连接已经关闭了?或者在两个不同的线程中使用相同的连接
以下是一些有效的示例代码:
{-# 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
{-#语言重载字符串}
导入控制
导入符合条件的数据。文本为T
导入Database.SQLite.Simple
导入Database.SQLite.Simple.FromRow
dumpTable conn table=do
r错误消息是什么?这是编译器错误还是运行时错误?这是一个运行时错误:SQLite3在尝试执行准备“更新测试集v=?”时返回错误误用:库例程按顺序调用错误消息是什么?这是一个编译器错误还是一个运行时错误?这是一个运行时错误:SQLite3在尝试执行准备“更新测试集v=?”时返回错误误用:库例程按顺序调用是的,我在3个线程中使用连接,因为我的程序的目的是测试sqlite是否为单线程。如果这是错误的原因,那么我的测试似乎证明sqlite不是多线程的。谢谢:DEach连接是单线程的,但是sqlite允许并发访问和更新,所以只需为每个线程打开一个新的连接。例如,请看这个答案:是的,我在3个线程中使用连接,因为我的程序的目的是测试sqlite是否是单线程的。如果这是错误的原因,那么我的测试似乎证明sqlite不是多线程的。谢谢:DEach连接是单线程的,但sqlite允许并发访问和更新,所以只需为每个线程打开一个新连接即可。例如,请参阅下面的答案: