pwiz, a model generator
pwiz
is a little script that ships with peewee and is capable ofintrospecting an existing database and generating model code suitable forinteracting with the underlying data. If you have a database already, pwiz cangive you a nice boost by generating skeleton code with correct columnaffinities and foreign keys.
If you install peewee using setup.py install
, pwiz will be installed as a“script” and you can just run:
- python -m pwiz -e postgresql -u postgres my_postgres_db
This will print a bunch of models to standard output. So you can do this:
- python -m pwiz -e postgresql my_postgres_db > mymodels.py
- python # <-- fire up an interactive shell
- >>> from mymodels import Blog, Entry, Tag, Whatever
- >>> print [blog.name for blog in Blog.select()]
Command-line options
pwiz accepts the following command-line options:
Option | Meaning | Example |
---|---|---|
-h | show help | |
-e | database backend | -e mysql |
-H | host to connect to | -H remote.db.server |
-p | port to connect on | -p 9001 |
-u | database user | -u postgres |
-P | database password | -P (will be prompted for password) |
-s | schema | -s public |
-t | tables to generate | -t tweet,users,relationships |
-v | generate models for VIEWs | (no argument) |
-i | add info metadata to generated file | (no argument) |
-o | table column order is preserved | (no argument) |
The following are valid parameters for the engine
(-e
):
- sqlite
- mysql
- postgresql
Warning
If a password is required to access your database, you will be prompted toenter it using a secure prompt.
The password will be included in the output. Specifically, at the topof the file a Database
will be defined along with any requiredparameters – including the password.
pwiz examples
Examples of introspecting various databases:
- # Introspect a Sqlite database.
- python -m pwiz -e sqlite path/to/sqlite_database.db
- # Introspect a MySQL database, logging in as root. You will be prompted
- # for a password ("-P").
- python -m pwiz -e mysql -u root -P mysql_db_name
- # Introspect a Postgresql database on a remote server.
- python -m pwiz -e postgres -u postgres -H 10.1.0.3 pg_db_name
Full example:
- $ sqlite3 example.db << EOM
- CREATE TABLE "user" ("id" INTEGER NOT NULL PRIMARY KEY, "username" TEXT NOT NULL);
- CREATE TABLE "tweet" (
- "id" INTEGER NOT NULL PRIMARY KEY,
- "content" TEXT NOT NULL,
- "timestamp" DATETIME NOT NULL,
- "user_id" INTEGER NOT NULL,
- FOREIGN KEY ("user_id") REFERENCES "user" ("id"));
- CREATE UNIQUE INDEX "user_username" ON "user" ("username");
- EOM
- $ python -m pwiz -e sqlite example.db
Produces the following output:
- from peewee import *
- database = SqliteDatabase('example.db', **{})
- class UnknownField(object):
- def __init__(self, *_, **__): pass
- class BaseModel(Model):
- class Meta:
- database = database
- class User(BaseModel):
- username = TextField(unique=True)
- class Meta:
- table_name = 'user'
- class Tweet(BaseModel):
- content = TextField()
- timestamp = DateTimeField()
- user = ForeignKeyField(column_name='user_id', field='id', model=User)
- class Meta:
- table_name = 'tweet'
Observations:
- The foreign-key
Tweet.user_id
is detected and mapped correctly. - The
User.username
UNIQUE constraint is detected. - Each model explicitly declares its table name, even in cases where it is notnecessary (as Peewee would automatically translate the class name into theappropriate table name).
- All the parameters of the
ForeignKeyField
are explicitlydeclared, even though they follow the conventions Peewee uses by default.
Note
The UnknownField
is a placeholder that is used in the event your schemacontains a column declaration that Peewee doesn’t know how to map to afield class.