peewee - Define models separately from Database() initialization
Asked Answered
A

1

7

I need to use some ORM engine, like peewee, for handling SQLite database within my python application. However, most of such libraries offer syntax like this to define models.py:

import peewee

db = peewee.Database('hello.sqlite')

class Person(peewee.Model):
    name = peewee.CharField()

    class Meta:
        database = db

However, in my application, i cannot use such syntax since database file name is provided by outside code after import, from module, which imports my models.py.

How to initialize models from outside of their definition knowing dynamic database file name? Ideally, models.py should not contain "database" mentions at all, like normal ORM.

Assegai answered 8/9, 2016 at 15:59 Comment(0)
I
9

Maybe you are looking at proxy feature : proxy - peewee

database_proxy = Proxy()  # Create a proxy for our db.

class BaseModel(Model):
    class Meta:
        database = database_proxy  # Use proxy for our DB.

class User(BaseModel):
    username = CharField()

# Based on configuration, use a different database.
if app.config['DEBUG']:
    database = SqliteDatabase('local.db')
elif app.config['TESTING']:
    database = SqliteDatabase(':memory:')
else:
    database = PostgresqlDatabase('mega_production_db')

# Configure our proxy to use the db we specified in config.
database_proxy.initialize(database)
Inapproachable answered 13/9, 2016 at 6:52 Comment(1)
Perfect. Thanks for the answer!Assegai

© 2022 - 2024 — McMap. All rights reserved.