Christopher Shroba
Christopher Shroba

Reputation: 7544

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

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?

Upvotes: 13

Views: 3842

Answers (2)

sterling baldwin
sterling baldwin

Reputation: 181

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)

Upvotes: 10

coleifer
coleifer

Reputation: 26235

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.

Upvotes: 4

Related Questions