How can I dynamically set the SQLite database file in Peewee?

3.5k views Asked by At

I'm using Peewee for a project I'm working on, and I'm trying to figure out how to dynamically set the database so that I can use one for production and one for testing. All the examples I've seen have the following line outside of any class:

database = SqliteDatabase(DATABASE)

which I find strange, since I would think that you would want that to be in a class so you could pass in different database paths. Any suggestions for choosing one database for prod and another for testing?

2

There are 2 answers

1
coleifer On

The database is typically declared at module scope because the model classes are defined there, and they typically depend on the database.

However, you can defer the initialization of your database using these techniques:

The first is useful if you are using the same database class. You really only need the Proxy when you're using Sqlite for dev and Postgres for prod, e.g.

0
sterling baldwin On

I just came across a similar issue, here's how I solved it to define the path to the database at run time:

Models file:

import peewee

database = peewee.SqliteDatabase(None)  # Defer initialization

class SomeData(peewee.Model):
    somefield = peewee.CharField()

    class Meta:
        database = database

Then in the class that uses the database:

from models import SomeData

class DatabaseUser:
    def __init__(self, db_path):
        database.init(db_path)