LoginSignup
1
2

More than 5 years have passed since last update.

Peeweeで外部キーを指定しても有効にならなかった

Posted at

きっかけ

on_deleteにCASCADEを指定したのに参照先レコードを削除しても一緒に消えてくれない...

models.py
import peewee

DB_FILE = "application.db"
db = peewee.SqliteDatabase(DB_FILE)


class User(peewee.Model):
    no = peewee.AutoField()
    name = peewee.CharField(unique=True)

    class Meta:
        database = db


class Devices(peewee.Model):
    no = peewee.AutoField()
    id = peewee.CharField(unique=True)
    owner = peewee.ForeignKeyField(User, on_delete='CASCADE', related_name='devices')

    class Meta:
        database = db

結論

どうやらSQliteでは外部キーがデフォルトでオフになっているらしく手動でオンにする必要があるみたい
どういう意図なんだろう...

参考
SQLiteで外字キー設定する
http://d.hatena.ne.jp/watanata2000/20110224/1298524729

確かにコンソールで確認するとオフになっていた

sqlite> PRAGMA foreign_keys;
foreign_keys = 0

解決策

Peewee PRAGMA statements

ドキュメントを確認するとPweeweeで外部キーを有効にする方法は以下

db = SqliteDatabase('my_app.db', pragmas={
    'foreign_keys': 1,
})
db.pragma('foreign_keys', 1, permanent=True)

後者を選択

models.py
import peewee

DB_FILE = "application.db"
db = peewee.SqliteDatabase(DB_FILE)
db.pragma('foreign_keys', 1, permanent=True)

再びコンソールで確認したが設定は反映されず

sqlite> PRAGMA foreign_keys;
foreign_keys = 0

ただ、アプリケーション上では正しく外部キーが機能することを確認:v:
DBファイルには設定が残らず、接続時の設定として管理されているんだろうか

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2