Skip to content

Instantly share code, notes, and snippets.

@shamrin
Last active August 29, 2015 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shamrin/8fe325d798c201e8e63b to your computer and use it in GitHub Desktop.
Save shamrin/8fe325d798c201e8e63b to your computer and use it in GitHub Desktop.
peewee sqlite migration bug, https://github.com/coleifer/peewee/issues/474
$ rm -f test.sqlite && python bug_models.py create && python bug_add.py && echo '.schema' | sqlite3 test.sqlite
CREATE TABLE "device" ("id" INTEGER NOT NULL PRIMARY KEY, "name" VARCHAR(20) NOT NULL, "owner_id" INTEGER, "network_id" INTEGER, FOREIGN KEY ("owner_id") REFERENCES "user" ("id"));
CREATE TABLE "network" ("id" INTEGER NOT NULL PRIMARY KEY, "name" TEXT NOT NULL);
CREATE TABLE "user" ("id" INTEGER NOT NULL PRIMARY KEY, "full_name" VARCHAR(128) NOT NULL);
CREATE INDEX "device_network_id" ON "device" ("network_id");
CREATE INDEX "device_owner_id" ON "device" ("owner_id");

$ rm -f test.sqlite && python bug_models.py create && python bug_drop.py
…
peewee.OperationalError: unknown column "owner_id" in foreign key definition
from peewee import ForeignKeyField
from playhouse.migrate import migrate, SqliteMigrator
from bug_models import Network, db
migrator = SqliteMigrator(db)
migrate(
migrator.add_column('device', 'network_id', ForeignKeyField(Network, null=True, to_field=Network.id)),
migrator.add_index('device', ('network_id',)),
)
from playhouse.migrate import migrate, SqliteMigrator
from bug_models import db
migrator = SqliteMigrator(db)
migrate(
migrator.drop_index('device', 'device_owner_id'),
migrator.drop_column('device', 'owner_id'),
)
import sys
import peewee
db = peewee.SqliteDatabase('test.sqlite')
class BaseModel(peewee.Model):
class Meta:
database = db
class User(BaseModel):
full_name = peewee.CharField(max_length=128)
class Network(BaseModel):
name = peewee.TextField()
class Device(BaseModel):
name = peewee.CharField(max_length=20)
owner = peewee.ForeignKeyField(User, related_name='devices', null=True)
if __name__ == '__main__':
if len(sys.argv) >= 2 and sys.argv[1] == 'create':
User.create_table()
Device.create_table()
Network.create_table()
user = User.create(full_name='Admin')
network = Network.create(name='Demo network')
Device.create(name='device 1', owner=user)
Device.create(name='device 2')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment