Tracking changes in peewee between versions. For a complete view of all the releases, visit GitHub:
https://github.com/coleifer/peewee/releases
This release includes a couple new field types and greatly improved C extension support for both speedups and SQLite enhancements. Also includes some work, suggested by @foxx, to remove some places where Proxy
was used in favor of more obvious APIs.
- travis-ci builds now include MySQL and Python 3.5. Dropped support for Python 3.2 and 3.3. Builds also will run the C-extension code.
- C extension speedups now enabled by default, includes faster implementations for
dict
andtuple
QueryResultWrapper
classes, faster date formatting, and a faster field and model sorting. - C implementations of SQLite functions is now enabled by default. SQLite extension is now compatible with APSW and can be used in standalone form directly from Python. See SqliteExtDatabase for more details.
- SQLite C extension now supports
murmurhash2
. UUIDField
is now supported for SQLite and MySQL, usingtext
andvarchar
respectively, thanks @foxx!- Added
BinaryField
, thanks again, @foxx! - Added
PickledField
toplayhouse.fields
. ManyToManyField
now accepts a list of primary keys when adding or removing values from the through relationship.- Added support for SQLite table-valued functions using the sqlite-vtfunc library.
- Significantly simplified the build process for compiling the C extensions.
- Instead of using a
Proxy
for defining circular foreign key relationships, you now need to use DeferredRelation. - Instead of using a
Proxy
for defining many-to-many through tables, you now need to use DeferredThroughModel. - SQLite Virtual Models must now use
Meta.extension_module
andMeta.extension_options
to declare extension and any options. For more details, see VirtualModel. - MySQL database will now issue
COMMIT
statements forSELECT
queries. This was not necessary, but added due to an influx of confused users creating GitHub tickets. Hint: learn to user your damn database, it's not magic!
Some of these may have been included in a previous release, but since I did not list them I'm listing them here.
- #766, fixed bug with PasswordField and Python3. Fuck Python 3.
- #768, fixed SortedFieldList and
remove_field()
. Thanks @klen! - #771, clarified docs for APSW.
- #773, added docs for request hooks in Pyramid (who uses Pyramid, by the way?).
- #774, prefetch() only loads first ForeignKeyField for a given relation.
- #782, fixed typo in docs.
- #791, foreign keys were not correctly handling coercing to the appropriate python value.
- #792, cleaned up some CSV utils code.
- #798, cleaned up iteration protocol in QueryResultWrappers.
- #806, not really a bug, but MySQL users were clowning around and needed help.
This is another small release which adds code to automatically build the SQLite C extension if libsqlite
is available. The release also includes:
- Support for
UUIDField
with SQLite. - Support for registering additional database classes with the
db_url
module viaregister_database
. prefetch()
supports fetching multiple foreign-keys to the same model class.- Added method to validate FTS5 search queries.
Small release which includes some changes to the BM25 sorting algorithm and the addition of a JSONField
for use with the new JSON1 extension.
People were having trouble building the sqlite extension. I figure enough people are having trouble that I made it a separate command: python setup.py build_sqlite_ext
.
Jacked up the setup.py
New APIs, features, and performance improvements.
PasswordField
that uses thebcrypt
module.- Added new Model
Meta.only_save_dirty
flag to, by default, only save fields that have been modified. - Added support for
upsert()
on MySQL (in addition to SQLite). - Implemented SQLite ranking functions (
rank
andbm25
) in Cython, and changed both the Cython and Python APIs to accept weight values for every column in the search index. This more closely aligns with the APIs provided by FTS5. In fact, made the APIs for FTS4 and FTS5 result ranking compatible. - Major changes to the :ref:
sqlite_ext
module. Function callbacks implemented in Python were implemented in Cython (e.g. date manipulation and regex processing) and will be used if Cython is available when Peewee is installed. - Support for the experimental new FTS5 SQLite search extension.
- Added :py:class:
SearchField
for use with the SQLite FTS extensions. - Added :py:class:
RowIDField
for working with the specialrowid
column in SQLite. - Added a model class validation hook to allow model subclasses to perform any validation after class construction. This is currently used to ensure that
FTS5Model
subclasses do not violate any rules required by the FTS5 virtual table.
- #751, fixed some very broken behavior in the MySQL migrator code. Added more tests.
- #718, added a
RetryOperationalError
mixin that will try automatically reconnecting after a failed query. There was a bug in the previous error handler implementation that made this impossible, which is also fixed.
- #713, fix column name regular expression in SQLite migrator.
- #724, fixed
NULL
handling with the PostgresqlJSONField
. - #725, added
__module__
attribute toDoesNotExist
classes. - #727, removed the
commit_select
logic for MySQL databases. - #730, added documentation for
Meta.order_by
API. - #745, added
cast()
method for casting JSON field values. - #748, added docs and method override to indicate that SQLite does not support adding foreign key constraints after table creation.
- Check whether pysqlite or libsqlite were compiled with BerkeleyDB support when using the :py:class:
BerkeleyDatabase
. - Clean up the options passed to SQLite virtual tables on creation.
- #700, use sensible default if field's declared data-type is not present in the field type map.
- #707, allow model to be specified explicitly in
prefetch()
. - #734, automatic testing against python 3.5.
- #753, added support for
upsert()
ith MySQL via theREPLACE INTO ...
statement. - #757,
pwiz
, the schema intropsection tool, will now generate multi-column index declarations. - #756,
pwiz
will capture passwords using thegetpass()
function rather than via the command-line. - Removed
Database.sql_error_handler()
, replaced with theRetryOperationalError
mixin class. - Documentation for
Meta.order_by
andMeta.primary_key
. - Better documentation around column and table constraints.
- Improved performance for some methods that are called frequently.
- Added
coerce
parameter toBareField
and added documentation.
Updating so some of the new APIs are available on pypi.
- #646, fixed a bug with the Cython speedups not being included in package.
- #654, documented how to create models with no primary key.
- #659, allow bare
INSERT
statements. - #674, regarding foreign key / one-to-one relationships.
- #676, allow
ArrayField
to accept tuples in addition to lists. - #679, fix regarding unsaved relations.
- #682, refactored QueryResultWrapper to allow multiple independent iterations over the same underlying result cache.
- #692, fix bug with multiple joins to same table + eager loading.
- #695, fix bug when connection fails while using an execution context.
- #698, use correct column names with non-standard django foreign keys.
- #706, return
datetime.time
instead oftimedelta
for MySQL time fields. - #712, fixed SQLite migrator regular expressions. Thanks @sroebert.
- #647, #649, #650, added support for
RETURNING
clauses. Update, Insert and Delete queries can now be called withRETURNING
to retrieve the rows that were affected. See docs. - #685, added web request hook docs.
- #691, allowed arbitrary model attributes and methods to be serialized by
model_to_dict()
. Docs. - #696, allow
model_to_dict()
to introspect query for which fields to serialize. - Added backend-agnostic truncate_date() implementation.
- Added a
FixedCharField
which uses column typeCHAR
. - Added support for arbitrary
PRAGMA
statements to be run on new SQLite connections. Docs. - Removed
berkeley_build.sh
script. See instructions on my blog instead.
Just a regular old release.
- #641, fixed bug with exception wrapping and Python 2.6
- #634, fixed bug where correct query result wrapper was not being used for certain composite queries.
- #625, cleaned up some example code.
- #614, fixed bug with
aggregate_rows()
when there are multiple joins to the same table.
- Added create_or_get() as a companion to
get_or_create()
. - Added support for
ON CONFLICT
clauses forUPDATE
andINSERT
queries. Docs. - Added a JSONKeyStore to
playhouse.kv
. - Added Cythonized version of
strip_parens()
, with plans to perhaps move more performance-critical code to Cython in the future. - Added docs on specifying vendor-specific database parameters.
- Added docs on specifying field default values (both client and server-side).
- Added docs on foreign key field back-references.
- Added docs for models without a primary key.
- Cleaned up docs on
prefetch()
andaggregate_rows()
.
This release contains a number of small fixes and enhancements.
- #606, support self-referential joins with
prefetch
andaggregate_rows()
methods. - #588, accomodate changes in SQLite's
PRAGMA index_list()
return value. - #607, fixed bug where
pwiz
was not passing table names to introspector. - #591, fixed bug with handling of named cursors in older psycopg2 version.
- Removed some cruft from the
APSWDatabase
implementation.
- Added CompressedField and AESEncryptedField
- #609, #610, added Django-style foreign key ID lookup. Docs.
- Added support for Hybrid Attributes (cool idea courtesy of SQLAlchemy).
- Added
upsert
keyword argument to theModel.save()
function (SQLite only). - #587, added support for
ON CONFLICT
SQLite clause forINSERT
andUPDATE
queries. Docs - #601, added hook for programmatically defining table names. Model options docs
- #581, #611, support connection pools with
playhouse.db_url.connect()
. Docs. - Added Contributing section section to docs.
This is a tiny update, mainly consisting of a new-and-improved implementation of get_or_create()
(docs).
get_or_create()
now returns a 2-tuple consisting of the model instance and a boolean indicating whether the instance was created. The function now behaves just like the Django equivalent.
- #574, better support for setting the character encoding on Postgresql database connections. Thanks @klen!
- Improved implementation of get_or_create().
This is a relatively small release with a few important bugfixes.
- #566, fixed a bug regarding parentheses around compound
SELECT
queries (i.e.UNION
,INTERSECT
, etc). - Fixed unreported bug where table aliases were not generated correctly for compound
SELECT
queries. - #559, add option to preserve original column order with
pwiz
. Thanks @elgow! - Fixed unreported bug where selecting all columns from a
ModelAlias
does not use the appropriateFieldAlias
objects.
- #561, added an option for bulk insert queries to return the list of auto-generated primary keys. See docs for InsertQuery.return_id_list.
- #569, added
parse
function to theplayhouse.db_url
module. Thanks @stt! - Added hacks section to the docs. Please contribute your hacks!
- Calls to
Node.in_()
andNode.not_in()
do not take*args
anymore and instead take a single argument.
There are a couple new features so I thought I'd bump to 2.5.x. One change Postgres users may be happy to see is the use of INSERT ... RETURNING
to perform inserts. This should definitely speed up inserts for Postgres, since an extra query is no longer needed to get the new auto-generated primary key.
I also added a new context manager/decorator that allows you to use a different database for the duration of the wrapped block.
- #534, CSV utils was erroneously stripping the primary key from CSV data.
- #537, fix upserts when using
insert_many
. - #541, respect
autorollback
withPostgresqlExtDatabase
. Thanks @davidmcclure. - #551, fix for QueryResultWrapper's implementation of the iterator protocol.
- #554, allow SQLite journal_mode to be set at run-time.
- Fixed case-sensitivity issue with
DataSet
.
- Added support for CAST expressions.
- Added a hook for extending Node with custom methods.
JOIN_<type>
becameJOIN.<type>
, e.g..join(JOIN.LEFT_OUTER)
.OP_<code>
becameOP.<code>
.- #556, allowed using
+
and-
prefixes to indicate ascending/descending ordering. - #550, added Database.initialize_connection() hook.
- #549, bind selected columns to a particular model. Thanks @jhorman, nice PR!
- #531, support for swapping databases at run-time via Using.
- #530, support for SQLCipher and Python3.
- New
RowIDField
forsqlite_ext
playhouse module. This field can be used to interact with SQLiterowid
fields. - Added
LateralJoin
helper to thepostgres_ext
playhouse module. - New example blog app.
- #504, Docs updates.
- #506, Fixed regression in
aggregate_rows()
- #510, Fixes bug in pwiz overwriting columns.
- #514, Correctly cast foreign keys in
prefetch()
. - #515, Simplifies queries issued when doing recursive deletes.
- #516, Fix cloning of Field objects.
- #519, Aggregate rows now correctly preserves ordering of joined instances.
- Unreported, fixed bug to not leave expired connections sitting around in the pool.
- Added support for Postgresql's
jsonb
type with BinaryJSONField. - Add some basic Flask helpers.
- Add support for
UNION ALL
queries in #512 - Add
SqlCipherExtDatabase
, which combines the sqlcipher database with the sqlite extensions. - Add option to print metadata when generating code with
pwiz
.
This is a relatively small release with mostly bug fixes and updates to the documentation. The one new feature I'd like to highlight is the ManyToManyField
(docs).
- #503, fixes behavior of
aggregate_rows()
when used with aCompositeKey
. - #498, fixes value coercion for field aliases.
- #492, fixes bug with pwiz and composite primary keys.
- #486, correctly handle schemas with reflection module.
- Peewee has a new ManyToManyField available in the
playhouse.shortcuts
module. - Peewee now has proper support for NOT IN queries through the
Node.not_in()
method. - Models now support iteration. This is equivalent to
Model.select()
.
I'm excited about this release, as in addition to a number of new features and bugfixes, it also is a step towards cleaner code. I refactored the tests into a number of modules, using a standard set of base test-cases and helpers. I also introduced the mock
library into the test suite and plan to use it for cleaner tests going forward. There's a lot of work to do to continue cleaning up the tests, but I'm feeling good about the changes. Curiously, the test suite runs faster now.
- #471, #482 and #484, all of which had to do with how joins were handled by the
aggregate_rows()
query result wrapper. - #472 removed some needless special-casing in
Model.save()
. - #466 fixed case-sensitive issues with the SQLite migrator.
- #474 fixed a handful of bugs that cropped up migrating foreign keys with SQLite.
- #475 fixed the behavior of the SQLite migrator regarding auto-generated indexes.
- #479 fixed a bug in the code that stripped extra parentheses in the SQL generator.
- Fixed a handful of bugs in the APSW extension.
- Added connection abstraction called
ExecutionContext
(see docs). - Made all context managers work as decorators (
atomic
,transaction
,savepoint
,execution_context
). - Added explicit methods for
IS NULL
andIS NOT NULL
queries. The latter was actually necessary since the behavior is different fromNOT IS NULL (...)
. - Allow disabling backref validation (#465)
- Made quite a few improvements to the documentation, particularly sections on transactions.
- Added caching to the DataSet extension, which should improve performance.
- Made the SQLite migrator smarter with regards to preserving indexes when a table copy is necessary.
Biggest news: peewee has a new logo!
- Small documentation updates here and there.
- The argument signature for the
SqliteExtDatabase.aggregate()
decorator changed so that the aggregate name is the first parameter, and the number of parameters is the second parameter. If no values are specified, peewee will choose the name of the class and an un-specified number of arguments (-1
). - The logic for saving a model with a composite key changed slightly. Previously, if a model had a composite primary key and you called
save()
, only the dirty fields would be saved.
- #462
- #465, add hook for disabling backref validation.
- #466, fix case-sensitive table names with migration module.
- #469, save only dirty fields.
- Lots of enhancements and cleanup to the
playhouse.apsw_ext
module. - The
playhouse.reflection
module now supports introspecting indexes. - Added a model option for disabling backref validation.
- Added support for the SQLite closure table extension.
- Added support for virtual fields, which act on dynamically-created virtual table fields.
- Added a new example: a virtual table implementation that exposes Redis as a relational database table.
- Added a module
playhouse.sqlite_aggregates
that contains a handful of aggregates you may find useful when developing with SQLite.
This release contains numerous improvements, particularly around the built-in database introspection utilities. Peewee should now also be compatible with PyPy.
- #466, table names are case sensitive in the SQLite migrations module.
- #465, added option to disable backref validation.
- #462, use the schema name consistently with postgres reflection.
- New model Meta option to disable backref validation. See validate_backrefs.
- Added documentation on ordering by calculated values.
- Added basic PyPy compatibility.
- Added logic to close cursors after they have been exhausted.
- Structured and consolidated database metadata introspection, including improvements for introspecting indexes.
- Added support to prefetch for traversing up the query tree.
- Added introspection option to skip invalid models while introspecting.
- Added option to limit the tables introspected.
- Added closed connection detection to the MySQL connection pool.
- Enhancements to passing options to creating virtual tables with SQLite.
- Added factory method for generating Closure tables for use with the
transitive_closure
SQLite extension. - Added support for loading SQLite extensions.
- Numerous test-suite enhancements and new test-cases.
This release contains a number of improvements to the reflection
and migrate
extension modules. I also added an encrypted diary app to the examples directory.
- #449, typo in the db_url extension, thanks to @malea for the fix.
- #457 and #458, fixed documentation deficiences.
- Added support for importing data when using the DataSet extension.
- Added an encrypted diary app to the examples.
- Better index reconstruction when altering columns on SQLite databases with the migrate module.
- Support for multi-column primary keys in the reflection module.
- Close cursors more aggressively when executing SELECT queries.
This release contains a few small bugfixes.
- #448, add hook to the connection pool for detecting closed connections.
- #229, fix join attribute detection.
- #447, fixed documentation typo.
This release contains a number of enhancements to the playhouse
collection of extensions.
As of 2.4.0, most of the introspection logic was moved out of the pwiz
module and into playhouse.reflection
.
- Created a new reflection extension for introspecting databases. The reflection module additionally can generate actual peewee Model classes dynamically.
- Created a dataset library (based on the SQLAlchemy project of the same name). For more info check out the blog post announcing playhouse.dataset.
- Added a db_url module which creates
Database
objects from a connection string. - Added csv dump functionality to the CSV utils extension.
- Added an atomic context manager to support nested transactions.
- Added support for HStore, JSON and TSVector to the
reflection
module. - More documentation updates.
- Fixed #440, which fixes a bug where
Model.dirty_fields
did not return an empty set for some subclasses ofQueryResultWrapper
.
This release contains a lot of improvements to the documentation and a mixed bag of other new features and bugfixes.
As of 2.3.3, all peewee Database
instances have a default of True
for the threadlocals
parameter. This means that a connection is opened for each thread. It seemed to me that by sharing connections across threads caused a lot of confusion to users who weren't aware of (or familiar with) the threadlocals
parameter. For single-threaded apps the behavior will not be affected, but for multi-threaded applications, if you wish to share your connection across threads you must now specify threadlocals=False
. For more information, see the documentation.
I also renamed the Model.get_id()
and Model.set_id()
convenience methods so as not to conflict with Flask-Login. These methods should have probably been private anyways, and the new methods are named _get_pk_value()
and _set_pk_value()
.
- Basic support for Postgresql full-text search.
- Helper functions for converting models to dictionaries and unpacking dictionaries into model instances. See docs.
- Fixed #428, documentation formatting error.
- Fixed #429, which fixes the way default values are initialized for bulk inserts.
- Fixed #432, making the HStore extension optional when using
PostgresqlExtDatabase
. - Fixed #435, allowing peewee to be used with Flask-Login.
- Fixed #436, allowing the SQLite date_part and date_trunc functions to correctly handle NULL values.
- Fixed #438, in which the ordering of clauses in a Join expression were causing unpredictable behavior when selecting related instances.
- Updated the
berkeley_build.sh
script, which was incompatible with the newest version ofbsddb3
.
This release contains mostly bugfixes.
- Fixed #421, allowing division operations to work correctly in py3k.
- Added support for custom json.dumps command, thanks to @alexlatchford.
- Fixed some foreign key generation bugs with pwiz in #426.
- Fixed a parentheses bug with UNION queries, #422.
- Added support for returning partial JSON data-structures from postgresql.
This release contains a fix for a bug introducted in 2.3.0. Table names are included, unquoted, in update queries now, which is causing some problems when the table name is a keyword.
This release contains a number of bugfixes, enhancements and a rewrite of much of the documentation.
- New and improved documentation
- Added aggregate_rows() method for mitigating N+1 queries.
- Query compiler performance improvements and rewrite of table alias internals (51d82fcd and d8d55df04).
- Added context-managers and decorators for counting queries and asserting query counts.
- Allow
UPDATE
queries to contain subqueries for values (example). - Support for
INSERT INTO / SELECT FROM
queries (docs). - Allow
SqliteDatabase
to set the database's journal mode. - Added method for concatenation (docs).
- Moved
UUIDField
out of the playhouse and into peewee - Added pskel script.
- Documentation for BerkeleyDB.
- #340, allow inner query values to be used in outer query joins.
- #380, fixed foreign key handling in SQLite migrations.
- #389, mark foreign keys as dirty on assignment.
- #391, added an
orwhere()
method. - #392, fixed
order_by
meta option inheritance bug. - #394, fixed UUID and conversion of foreign key values (thanks @alexlatchford).
- #395, allow selecting all columns using
SQL('*')
. - #396, fixed query compiler bug that was adding unnecessary parentheses around expressions.
- #405, fixed behavior of
count()
when query has a limit or offset.
This is a small release and contains a handful of fixes.
- Added a
Window
object for creating reusable window definitions. - Added support for
DISTINCT ON (...)
. - Added a BerkeleyDB-backed sqlite
Database
and build script. - Fixed how the
UUIDField
handlesNone
values (thanks @alexlatchford). - Fixed various things in the example app.
- Added 3.4 to the travis build (thanks @frewsxcv).
This release contains a complete rewrite of pwiz
as well as some improvements to the SQLite extension, including support for the BM25 ranking algorithm for full-text searches. I also merged support for sqlcipher, an encrypted SQLite database with many thanks to @thedod!
- Rewrite of
pwiz
, schema introspection utility. Model.save()
returns a value indicating the number of modified rows.- Fixed bug with
PostgresqlDatabase.last_insert_id()
leaving a transaction open in autocommit mode (#353). - Added BM25 ranking algorithm for full-text searches with SQLite.
This release contains a new migrations module in addition to a number of small features and bug fixes.
- New migrations module.
- Added a return value to
Model.save()
indicating number of rows affected. - Added a
date_trunc()
method that works for Sqlite. - Added a
Model.sqlall()
class-method to return all the SQL to generate the model / indices.
- #342, allow functions to not coerce parameters automatically.
- #338, fixed unaliased columns when using Array and Json fields with postgres, thanks @mtwesley.
- #331, corrected issue with the way unicode arrays were adapted with psycopg2.
- #328, pwiz / mysql bug.
- #326, fixed calculation of the alias_map when using subqueries.
- #324, bug with
prefetch()
not selecting the correct primary key.
I've been looking forward to this release, as it contains a couple new features that I've been wanting to add for some time now. Hope you find them useful.
- Window queries using
OVER
syntax. - Compound query operations
UNION
,INTERSECT
,EXCEPT
as well as symmetric difference.
- #300, pwiz was not correctly interpreting some foreign key constraints in SQLite.
- #298, drop table with cascade API was missing.
- #294, typo.
This release contains a large refactoring of the way SQL was generated for both
the standard query classes (Select
, Insert
, Update
, Delete
) as well as
for the DDL methods (create_table
, create_index
, etc). Instead of joining
strings of SQL and manually quoting things, I've created Clause
objects
containing multiple Node
objects to represent all parts of the query.
I also changed the way peewee determins the SQL to represent a field. Now a
field implements __ddl__
and __ddl_column__
methods. The former creates
the entire field definition, e.g.:
"quoted_column_name" <result of call to __ddl_column__> [NOT NULL/PRIMARY KEY/DEFAULT NEXTVAL(...)/CONSTRAINTS...]
The latter method is responsible just for the column type definition. This might
return VARCHAR(255)
or simply TEXT
. I've also added support for
arbitrary constraints on each field, so you might have:
price = DecimalField(decimal_places=2, constraints=[Check('price > 0')])
- Refactored query generation for both SQL queries and DDL queries.
- Support for arbitrary column constraints.
autorollback
option to theDatabase
class that will roll back the transaction before raising an exception.- Added
JSONField
type to thepostgresql_ext
module. - Track fields that are explicitly set, allowing faster saves (thanks @soasme).
- Allow the
FROM
clause to be an arbitraryNode
object (#290). schema
is a newModel.Mketa
option and is used throughout the code.- Allow indexing operation on HStore fields (thanks @zdxerr, #293).
- #277 (where calls not chainable with update query)
- #278, use
wraps()
, thanks @lucasmarshall - #284, call
prepared()
aftercreate()
, thanks @soasme. - #286, cursor description issue with pwiz + postgres
- Support for savepoints (Sqlite, Postgresql and MySQL) using an API similar to that of transactions.
- Common set of exceptions to wrap DB-API 2 driver-specific exception classes, e.g.
peewee.IntegrityError
. - When pwiz cannot determine the underlying column type, display it in a comment in the generated code.
- Support for circular foreign-keys.
- Moved
Proxy
into peewee (previously inplayhouse.proxy
). - Renamed
R()
toSQL()
. - General code cleanup, some new comments and docstrings.
- Fixed a small bug in the way errors were handled in transaction context manager.
- #257
- #265, nest multiple calls to functions decorated with
@database.commit_on_success
. - #266
- #267
Commits: https://github.com/coleifer/peewee/compare/2.1.6...2.1.7 Released 2013-12-25
Changes included in 2.1.6:
- Lightweight Django integration.
- Added a csv loader to playhouse.
- Register unicode converters per-connection instead of globally when using
pscyopg2
. - Fix for how the related object cache is invalidated (#243).
Commits: https://github.com/coleifer/peewee/compare/2.1.5...2.1.6 Released 2013-11-19
- Rewrote the
playhouse.postgres_ext.ServerSideCursor
helper to work with a single query. Docs. - Added error handler hook to the database class, allowing your code to choose how to handle errors executing SQL. Docs.
- Allow arbitrary attributes to be stored in
Model.Meta
a5e13bb26d6196dbd24ff228f99ff63d9c046f79. - Support for composite primary keys (!!). How-to and API docs.
- Added helper for generating
CASE
expressions. Docs. - Allow the table alias to be specified as a model
Meta
option. - Added ability to specify
NOWAIT
when issuingSELECT FOR UPDATE
queries.
- #147, SQLite auto-increment behavior.
- #222
- #223, missing call to
execute()
in docs. - #224, python 3 compatibility fix.
- #227, was using wrong column type for boolean with MySQL.
Commits: https://github.com/coleifer/peewee/compare/2.1.4...2.1.5 Released 2013-10-19
- Small refactor of some components used to represent expressions (mostly better names).
- Support for Array fields in postgresql.
- Added notes on Proxy
- Support for Server side cursors with postgresql.
- Code cleanups for more consistency.
Commits: https://github.com/coleifer/peewee/compare/2.1.3...2.1.4 Released 2013-08-05
- Added the
sqlite_ext
module, including support for virtual tables, full-text search, user-defined functions, collations and aggregates, as well as more granular locking. - Manually convert data-types when doing simple aggregations - fixes issue #208
- Profiled code and dramatically increased performance of benchmarks.
- Added a proxy object for lazy database initialization - fixes issue #210
Commits: https://github.com/coleifer/peewee/compare/2.1.2...2.1.3 Released 2013-06-28
Major rewrite, see notes here: http://docs.peewee-orm.com/en/latest/peewee/upgrading.html#upgrading