Haskell - 尝试查询刚创建的表时出现持久性错误

时间:2013-12-28 18:07:05

标签: sqlite haskell

我正在尝试使用持久性查询sqlite表,但是在收到消息后表示该表不存在时会收到一条消息。

Migrating: CREATE TABLE "Post"("id" INTEGER PRIMARY KEY,"content" VARCHAR NOT NULL)
user error (SQLite3 returned ErrorError while attempting to perform prepare "SELECT \"content\" FROM \"Post\" WHERE \"id\"=?": no such table: Post)

这是我正在运行的代码(它适用于scotty网络应用,所以这里有一些特定的东西)

runDb $ runMigration migrateAll --to create the table
liftIO $ runDb $ insert $ Post $ decodeUtf8 $ toStrict image --to attempt to insert the data, this is what fails

以下是我对这些功能的定义:

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistUpperCase|
Post
    content Text
|]

runDb :: SqlPersist (ResourceT IO) a -> IO a
runDb query = runResourceT . withSqliteConn ":memory:" . runSqlConn $ query

它似乎声称要创建表但实际上并没有这样做。

1 个答案:

答案 0 :(得分:2)

您正在内存中创建表,因此,每次运行runDb后,数据都会被丢弃。

有两种可能的解决方案:

  1. 使用文件存储数据(即 - 将“:memory:”更改为“filename.sqlite3”)。数据将在运行中持续运行。

  2. 运行代码以在单个runDb中创建和填充数据。代码将起作用,但数据将在运行中丢失。