2017-03-28 9 views
3

私はYesodを実行しており、MySQLデータベースにアクセスしています。Yesodデータベース移行ループ

私のモデルは次のとおりです。

Starting devel application 
Migrating: ALTER TABLE `user` ALTER COLUMN `password` DROP DEFAULT 
28/Mar/2017:23:46:44 +0200 [Debug#SQL] ALTER TABLE `user` ALTER COLUMN `password` DROP DEFAULT; [] 
devel.hs: ConnectionError {errFunction = "query", errNumber = 1101, errMessage = "BLOB/TEXT column 'password' can't have a default value"} 
Unexpected: child process exited with ExitFailure 1 
Trying again 
Starting devel application 
Migrating: ALTER TABLE `user` ALTER COLUMN `password` DROP DEFAULT 
28/Mar/2017:23:46:46 +0200 [Debug#SQL] ALTER TABLE `user` ALTER COLUMN `password` DROP DEFAULT; [] 
devel.hs: ConnectionError {errFunction = "query", errNumber = 1101, errMessage = "BLOB/TEXT column 'password' can't have a default value"} 
Unexpected: child process exited with ExitFailure 1 
Trying again 

それは決して終わることのないループに行く:

User 
    ident Text 
    password Text Maybe 
    UniqueUser ident 
    deriving Typeable 
Email 
    email Text 
    userId UserId Maybe 
    verkey Text Maybe 
    UniqueEmail email 
Comment json -- Adding "json" causes ToJSON and FromJSON instances to be derived. 
    message Text 
    userId UserId Maybe 
    deriving Eq 
    deriving Show 

-- By default this file is used in Model.hs (which is imported by Foundation.hs) 

私はイェソドアプリケーションを実行すると、それは次のように繰り返します。

この問題を回避するには、データベースの移行を無効にする意味Application.hsから次の行をコメントしている:

runLoggingT (runSqlPool (runMigration migrateAll) pool) logFunc 

をしかし、私は回避策を使用している場合、私は別のエラーを取得:

28/Mar/2017:23:56:28 +0200 [Error#yesod-core] Foundation.hs:(137,5)-(144,45): Non-exhaustive patterns in function isAuthorized 
@(yesod-core-1.4.32-6HthMZNCl0sEMRz6GJ4QO1:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:693:5) 
28/Mar/2017:23:56:28 +0200 [Debug#SQL] SELECT `ident`,`password` FROM `user` WHERE `id`=? ; [PersistInt64 1] 
GET /test 
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
    Status: 500 Internal Server Error 0.006514s 

答えて

2

Text Maybeの各列にdefault=NULLを追加すると、この問題が解決されます。 MySQLのバージョンによっては、sqltype=varchar(255)を追加して列の種類を変更する必要があります。あなたの場合、モデルは次のようになります:

User 
    ident Text 
    password Text Maybe sqltype=varchar(255) default=NULL 
    UniqueUser ident 
    deriving Typeable 
Email 
    email Text 
    userId UserId Maybe 
    verkey Text Maybe sqltype=varchar(255) default=NULL 
    UniqueEmail email 
Comment json -- Adding "json" causes ToJSON and FromJSON instances to be derived. 
    message Text 
    userId UserId Maybe 
    deriving Eq 
    deriving Show 

-- By default this file is used in Model.hs (which is imported by Foundation.hs) 
2

それはthis bug関連するように思えますマイグレーションとデフォルト値に変換します。

this workaroundデフォルト値でMySQLの動作を変更するか、textからvarcharに列の種類を変更してみてください。

+0

ありがとう!それを使って解決しました: 'alter table user modify column password varchar(255)default '';' –