3.9.4:
* Add Model.bulk_update() method for bulk-updating fields across multiple
model instances.
* Add lazy_load parameter to ForeignKeyField. When initialized with
lazy_load=False, the foreign-key will not use an additional query to
resolve the related model instance. Instead, if the related model instance is
not available, the underlying FK column value is returned (behaving like the
"_id" descriptor).
* Added Model.truncate_table() method.
* The reflection and pwiz extensions now attempt to be smarter about
converting database table and column names into snake-case. To disable this,
you can set snake_case=False when calling the Introspector.introspect()
method or use the -L (legacy naming) option with the pwiz script.
* Bulk insert via insert_many() no longer require specification of the
fields argument when the inserted rows are lists/tuples. In that case, the
fields will be inferred to be all model fields except any auto-increment id.
* Add DatabaseProxy, which implements several of the Database class context
managers. This allows you to reference some of the special features of the
database object without directly needing to initialize the proxy first.
* Add support for window function frame exclusion and added built-in support
for the GROUPS frame type.
* Add support for chaining window functions by extending a previously-declared
window function.
* Playhouse Postgresql extension TSVectorField.match() method supports an
additional argument plain, which can be used to control the parsing of the
TS query.
* Added very minimal JSONField to the playhouse MySQL extension.
3.9.3
* Added cross-database support for NULLS FIRST/LAST when specifying the
ordering for a query. Previously this was only supported for Postgres. Peewee
will now generate an equivalent CASE statement for Sqlite and MySQL.
* Added [EXCLUDED](http://docs.peewee-orm.com/en/latest/peewee/api.html#EXCLUDED)
helper for referring to the EXCLUDED namespace used with INSERT...ON CONFLICT
queries, when referencing values in the conflicting row data.
* Added helper method to the model Metadata class for setting the table name
at run-time. Setting the Model._meta.table_name directly may have appeared
to work in some situations, but could lead to subtle bugs. The new API is
Model._meta.set_table_name().
* Enhanced helpers for working with Peewee interactively, [see doc](http://docs.peewee-orm.com/en/latest/peewee/interactive.html).
* Fix cache invalidation bug in DataSet that was originally reported on the
sqlite-web project.
* New example script implementing a [hexastore]
3.9.2:
This release contains a fix for a test that was failing when 3.9.1 was tagged and released.
3.9.1:
Includes a bugfix for an AttributeError that occurs when using MySQL with the MySQLdb client.
3.9.0:
New and improved stuff
Added new document describing how to use peewee interactively.
Added convenience functions for generating model classes from a pre-existing database, printing model definitions and printing CREATE TABLE sql for a model. See the "use peewee interactively" section for details.
Added a __str__ implementation to all Query subclasses which converts the query to a string and interpolates the parameters.
Improvements to sqlite_ext.JSONField regarding the serialization of data, as well as the addition of options to override the JSON serialization and de-serialization functions.
Added index_type parameter to Field
Added DatabaseProxy, which allows one to use database-specific decorators with an uninitialized Proxy object.
Added support for INSERT ... ON CONFLICT when the conflict target is a partial index (e.g., contains a WHERE clause). The OnConflict and on_conflict() APIs now take an additional conflict_where parameter to represent the WHERE clause of the partial index in question.
Enhanced the playhouse.kv extension to use efficient upsert for all database engines. Previously upsert was only supported for sqlite and mysql.
Re-added the orwhere() query filtering method, which will append the given expressions using OR instead of AND.
Added some new examples to the examples/ directory
Added select_from() API for wrapping a query and selecting one or more columns from the wrapped subquery. Docs.
Added documentation on using row values.
Removed the (defunct) "speedups" C extension, which as of 3.8.2 only contained a barely-faster function for quoting entities.
Bugfixes
Fix bug in SQL generation when there was a subquery that used a common table expressions.
Enhanced prefetch() and fixed bug that could occur when mixing self-referential foreign-keys and model aliases.
MariaDB 10.3.3 introduces backwards-incompatible changes to the SQL used for upsert. Peewee now introspects the MySQL server version at connection time to ensure proper handling of version-specific features.
Fixed bug where TimestampField would treat zero values as None when reading from the database.
3.8.2
Backwards-incompatible changes
The default row-type for INSERT queries executed with a non-default RETURNING clause has changed from tuple to Model instances. This makes INSERT behavior consistent with UPDATE and DELETE queries that specify a RETURNING clause. To revert back to the old behavior, just append a call to .tuples() to your INSERT ... RETURNING query.
Removing support for the table_alias model Meta option. Previously, this attribute could be used to specify a "vanity" alias for a model class in the generated SQL. As a result of some changes to support more robust UPDATE and DELETE queries, supporting this feature will require some re-working. As of the 3.8.0 release, it was broken and resulted in incorrect SQL for UPDATE queries, so now it is removed.
New features
Added playhouse.shortcuts.ReconnectMixin, which can be used to implement automatic reconnect under certain error conditions (notably the MySQL error 2006 - server has gone away).
Bugfixes
Fix SQL generation bug when using an inline window function in the ORDER BY clause of a query.
Fix possible zero-division in user-defined implementation of BM25 ranking algorithm for SQLite full-text search.
3.8.1
New features
Sqlite SearchField now supports the match() operator, allowing full-text search to be performed on a single column (as opposed to the whole table).
Changes
Remove minimum passphrase restrictions in SQLCipher integration.
Bugfixes
Support inheritance of ManyToManyField instances.
Ensure operator overloads are invoked when generating filter expressions.
Fix incorrect scoring in Sqlite BM25, BM25f and Lucene ranking algorithms.
Support string field-names in data dictionary when performing an ON CONFLICT ... UPDATE query, which allows field-specific conversions to be applied.
3.8.0
**New features**
* Postgres BinaryJSONField now supports has_key(), concat() and
remove() methods (though remove may require pg10+).
* Add python_value() method to the SQL-function helper fn, to allow
specifying a custom function for mapping database values to Python values.
**Changes**
* Better support for UPDATE ... FROM queries, and more generally, more robust
support for UPDATE and RETURNING clauses. This means that the
QualifiedNames helper is no longer needed for certain types of queries.
* The SqlCipherDatabase no longer accepts a kdf_iter parameter. To
configure the various SQLCipher encryption settings, specify the setting
values as pragmas when initializing the database.
* Introspection will now, by default, only strip "_id" from introspected column
names if those columns are foreign-keys.
* Allow UUIDField and BinaryUUIDField to accept hexadecimal UUID strings as
well as raw binary UUID bytestrings (in addition to UUID instances, which
are already supported).
* Allow ForeignKeyField to be created without an index.
* Allow multiple calls to cast() to be chained.
* Add logic to ensure foreign-key constraint names that exceed 64 characters
are truncated using the same logic as is currently in place for long indexes.
* ManyToManyField supports foreign-keys to fields other than primary-keys.
* When linked against SQLite 3.26 or newer, support SQLITE_CONSTRAINT to
designate invalid queries against virtual tables.
* SQL-generation changes to aid in supporting using queries within expressions
following the SELECT statement.
**Bugfixes**
* Fixed bug in order_by_extend(), thanks @nhatHero.
* Fixed bug where the DataSet CSV import/export did not support non-ASCII
characters in Python 3.x.
* Fixed bug where model_to_dict would attempt to traverse explicitly disabled
foreign-key backrefs.
* Fixed bug when attempting to migrate SQLite tables that have a field whose
column-name begins with "primary_".
* Fixed bug with inheriting deferred foreign-keys.
3.7.1:
New features
* Added table_settings model Meta option, which should be a list of strings
specifying additional options for CREATE TABLE, which are placed *after*
the closing parentheses.
* Allow specification of on_update and on_delete behavior for many-to-many
relationships when using ManyToManyField.
Bugfixes
* Fixed incorrect SQL generation for Postgresql ON CONFLICT clause when the
conflict_target is a named constraint (rather than an index expression). This
introduces a new keyword-argument to the on_conflict() method:
conflict_constraint, which is currently only supported by Postgresql.
* Fixed incorrect SQL for sub-selects used on the right side of IN
expressions. Previously the query would be assigned an alias, even though an
alias was not needed.
* Fixed incorrect SQL generation for Model indexes which contain SQL functions
as indexed columns.
* Fixed bug in the generation of special queries used to perform operations on
SQLite FTS5 virtual tables.
* Allow frozenset to be correctly parameterized as a list of values.
* Allow multi-value INSERT queries to specify columns as a list of strings.
* Support CROSS JOIN for model select queries.
3.7.0:
Backwards-incompatible changes
* Pool database close_all() method renamed to close_idle() to better
reflect the actual behavior.
* Databases will now raise InterfaceError when connect() or close() are
called on an uninitialized, deferred database object.
New features
* Add methods to the migrations extension to support adding and dropping table
constraints.
* Add Model.bulk_create() method for bulk-inserting unsaved model instances.
* Add close_stale() method to the connection pool to support closing stale
connections.
* The FlaskDB class in playhouse.flask_utils now accepts a model_class
parameter, which can be used to specify a custom base-class for models.
Bugfixes
* Parentheses were not added to subqueries used in function calls with more
than one argument.
* Fixed bug when attempting to serialize many-to-many fields which were created
initially with a DeferredThroughModel.
* Fixed bug when using the Postgres ArrayField with an array of BlobField.
* Allow Proxy databases to be used as a context-manager.
* Fixed bug where the APSW driver was referring to the SQLite version from the
standard library sqlite3 driver, rather than from apsw.
* Reflection library attempts to wrap server-side column defaults in quotation
marks if the column data-type is text/varchar.
* Missing import in migrations library, which would cause errors when
attempting to add indexes whose name exceeded 64 chars.
* When using the Postgres connection pool, ensure any open/pending transactions
are rolled-back when the connection is recycled.
* Even *more* changes to the setup.py script. In this case I've added a
helper function which will reliably determine if the SQLite3 extensions can
be built. This follows the approach taken by the Python YAML package.
3.6.4:
Take a whole new approach, following what simplejson does. Allow the
build_ext command class to fail, and retry without extensions in the event we
run into issues building extensions.
3.6.3:
Add check in setup.py to determine if a C compiler is available before
building C extensions.
3.6.2:
Use ctypes.util.find_library to determine if libsqlite3 is installed.
Should fix problems people are encountering installing when SQLite3 is not
available.
3.6.1:
Fixed issue with setup script.
3.6.0:
* Support for Python 3.7, including bugfixes related to new StopIteration
handling inside of generators.
* Support for specifying ROWS or RANGE window frame types.
* Add APIs for user-defined window functions if using [pysqlite3](https://github.com/coleifer/pysqlite3)
and sqlite 3.25.0 or newer.
* TimestampField now uses 64-bit integer data-type for storage.
* Added support to pwiz and playhouse.reflection to enable generating
models from VIEWs.
* Added lower-level database API for introspecting VIEWs.
* Revamped continuous integration setup for better coverage, including 3.7 and
3.8-dev.
* Allow building C extensions even if Cython is not installed, by distributing
pre-generated C source files.
* Switch to using setuptools for packaging.
3.5.2:
New guide to using window functions in Peewee.
New and improved table name auto-generation. This feature is not backwards compatible, so it is disabled by default. To enable, set legacy_table_names=False in your model's Meta options. For more details, see table names documentation.
Allow passing single fields/columns to window function order_by and partition_by arguments.
Support for FILTER (WHERE...) clauses with window functions and aggregates.
Added IdentityField class suitable for use with Postgres 10's new identity column type. It can be used anywhere AutoField or BigAutoField was being used previously.
Fixed bug creating indexes on tables that are in attached databases (SQLite).
Fixed obscure bug when using prefetch() and ModelAlias to populate a back-reference related model.
3.5.1:
New features
------------
New documentation for working with relationships in Peewee.
Improved tests and documentation for MySQL upsert functionality.
Allow database parameter to be specified with ModelSelect.get() method.
Add QualifiedNames helper to peewee module exports.
Add temporary= meta option to support temporary tables.
Allow a Database object to be passed to constructor of DataSet helper.
Bug fixes
---------
Fixed edge-case where attempting to alias a field to it's underlying column-name (when different), Peewee would not respect the alias and use the field name instead.
Raise a ValueError when joining and aliasing the join to a foreign-key's object_id_name descriptor. Should prevent accidentally introducing O(n) queries or silently ignoring data from a joined-instance.
Fixed bug for MySQL when creating a foreign-key to a model which used the BigAutoField for it's primary-key.
Fixed bugs in the implementation of user-defined aggregates and extensions with the APSW SQLite driver.
Fixed regression introduced in 3.5.0 which ignored custom Model __repr__().
Fixed regression from 2.x in which inserting from a query using a SQL() was no longer working.
Backwards-incompatible changes
- Custom Model repr no longer use the convention of overriding
__unicode__, and now use __str__.
- Redesigned the sqlite json1 integration and changed some of the APIs
and semantics of various JSONField methods.
New features
- Better default repr for model classes and fields.
- ForeignKeyField() accepts a new initialization parameter,
deferrable, for specifying when constraints should be enforced.
- BitField.flag() can be called without a value parameter for the
common use-case of using flags that are powers-of-2.
- SqliteDatabase pragmas can be specified as a dict (previously
required a list of 2-tuples).
- SQLite TableFunction (docs) will print Python exception tracebacks
raised in the initialize and iterate callbacks, making debugging
significantly easier.
Bug fixes
- Fixed bug in migrator.add_column() where, if the field being added
declared a non-standard index type (e.g., binary json field with GIN
index), this index type was not being respected.
- Fixed bug in database.table_exists() where the implementation did
not match the documentation.
- Fixed bug in SQLite TableFunction implementation which raised errors
if the return value of the iterate() method was not a tuple.
Backwards-incompatible changes
- The regexp() operation is now case-sensitive for MySQL and Postgres.
To perform case-insensitive regexp operations, use iregexp().
- The SQLite BareField() field-type now supports all column
constraints except specifying the data-type. Previously it silently
ignored any column constraints.
- LIMIT and OFFSET parameters are now treated as parameterized values
instead of literals.
- The schema parameter for SQLite database introspection methods is no
longer ignored by default. The schema corresponds to the name given
to an attached database.
- ArrayField now accepts a new parameter field_kwargs, which is used
to pass information to the array field's field_class initializer.
New features and other changes
- SQLite backup interface supports specifying page-counts and a
user-defined progress handler.
- GIL is released when doing backups or during SQLite busy timeouts
(when using the peewee SQLite busy-handler).
- Add NATURAL join-type to the JOIN helper.
- Improved identifier quoting to allow specifying distinct
open/close-quote characters. Enables adding support for MSSQL, for
instance, which uses square brackets, e.g. [table].[column].
- Unify timeout interfaces for SQLite databases (use seconds
everywhere rather than mixing seconds and milliseconds, which was
confusing).
- Added attach() and detach() methods to SQLite database, making it
possible to attach additional databases (e.g. an in-memory cache
db).
3.3.4
- Added a BinaryUUIDField class for efficiently storing UUIDs in
16-bytes.
- Fix dataset's update_cache() logic so that when updating a single
table that was newly-added, we also ensure that all dependent tables
are updated at the same time.
3.3.3
- More efficient implementation of model dependency-graph generation.
Improves performance of recursively deleting related objects by
omitting unnecessary subqueries.
- Added union(), union_all(), intersect() and except_() to the
Model-specific query implementations. This was an oversight that
should have been patched in 3.3.2, but is fixed in 3.3.3.
- Major cleanup to test runner and standardized test skipping logic to
integrate with standard-library unittest conventions.
3.3.2
- Add methods for union(), union_all, intersect() and except_().
Previously, these methods were only available as operator overloads.
- Removed some Python 2.6-specific support code, as 2.6 is no longer
officially supported.
- Fixed model-graph resolution logic for deferred foreign-keys.
- Better support for UPDATE...FROM queries (Postgresql).
- Fixed long-standing bug in 3.x regarding using column aliases with
queries that utilize the ModelCursorWrapper (typically queries with
one or more joins).
- Fix typo in model metadata code, thanks @klen.
- Add examples of using recursive CTEs to docs.
- Added support for SQLite's new ON CONFLICT clause, which is modelled
on the syntax used by Postgresql and will be available in SQLite
3.24.0 and onward.
- Added better support for using common table expressions and a
cleaner way of implementing recursive CTEs, both of which are also
tested with integration tests (as opposed to just checking the
generated SQL).
- Modernized the CI environment to utilize the latest MariaDB
features, so we can test window functions and CTEs with MySQL (when
available).
- Reorganized and unified the feature-flags in the test suite.
- Added ValuesList for representing values lists.
- DateTimeField, DateField and TimeField will parse formatted-string
before sending to the database. Previously this only occurred when
reading values from the database.
- Smarter handling of model-graph when dealing with compound queries
(union, intersect, etc).
- If the same column-name is selected multiple times, first value
wins.
- If ModelSelect.switch() is called without any arguments, default to
the query's model.
- Fix issue where cloning a ModelSelect query did not result in the
joins being cloned.
- pwiz tool will capture column defaults defined as part of the
table schema.
- Fixed a misleading error message.
- Ensure reuse_if_open parameter has effect on pooled databases.
- Added support for on update/delete when migrating foreign-key.
- Fixed bug in SQL generation for subqueries in aliased functions.
3.2.2
- Added support for passing Model classes to the returning() method
when you intend to return all columns for the given model.
- Fixed a bug when using user-defined sequences, and the underlying
sequence already exists.
- Added drop_sequences parameter to drop_table() method which allows
you to conditionally drop any user-defined sequences when dropping
the table.
3.2.1
- If both mysql-python and pymysql libraries are installed, Peewee
will use pymysql by default.
- Added new module playhouse.mysql_ext which includes
MySQLConnectorDatabase, a database implementation that works with
the mysql-connector driver.
- Added new field to ColumnMetadata class which captures a database
column's default value. ColumnMetadata is returned by
Database.get_columns().
- Added documentation on making Peewee async.
3.2.0
- Potentially backwards-incompatible change: Field.coerce renamed to
Field.adapt.
3.1.6
- Added rekey() method to SqlCipher database for changing encryption
key and documentation for set_passphrase() method.
- Added convert_values parameter to ArrayField constructor, which will
cause the array values to be processed using the underlying
data-type's conversion logic.
- Fixed unreported bug using TimestampField with sub-second
resolutions.
- Fixed bug where options were not being processed when calling
drop_table().
- Some fixes and improvements to signals extension.
## 3.1.5
- Fixed Python 2/3 incompatibility with `itertools.izip_longest()`.
## 3.1.4
- Added `BigAutoField` to support 64-bit auto-incrementing primary
keys.
- Use Peewee-compatible datetime serialization when exporting JSON
from a `DataSet`. Previously the JSON export used ISO-8601 by default.
- Added `Database.batch_commit` helper to wrap iterators in chunked
transactions.
## 3.1.3
- Fixed issue where scope-specific settings were being updated
in-place instead of copied.
- Fixed bug where setting a `ForeignKeyField` did not add it to the
model's "dirty" fields list.
- Use pre-fetched data when using `prefetch()` with `ManyToManyField`.
- Use `JSON` data-type for SQLite `JSONField` instances.
- Add a `json_contains` function for use with SQLite `json1` extension.
- Various documentation updates and additions.
- Fixed issue where scope-specific settings were being updated
in-place instead of copied.
- Fixed bug where setting a ForeignKeyField did not add it to
the model's "dirty" fields list.
- Use pre-fetched data when using prefetch() with ManyToManyField.
- Use JSON data-type for SQLite JSONField instances.
- Add a json_contains function for use with SQLite json1 extension.
- Various documentation updates and additions.
- Fixed bug when using Model.alias() when the model defined a
particular database schema.
- Added SchemaManager.create_foreign_key API to simplify adding
constraints when dealing with circular foreign-key relationships.
- Improved implementation of Migrator.add_foreign_key_constraint so
that it can be used with Postgresql (in addition to MySQL).
- Added PickleField to the playhouse.fields module. Docs.
- Fixed bug in implementation of CompressedField when using Python 3.
- Added KeyValue API in playhouse.kv module. Docs.
- More test cases for joining on sub-selects or common table
expressions.
Backwards-incompatible changes
- Database.bind() has been renamed to Database.bind_ctx(), to more closely
match the semantics of the corresponding model methods, Model.bind() and
Model.bind_ctx(). The new Database.bind() method is a one-time operation
that binds the given models to the database. See documentation:
Other changes
- Removed Python 2.6 support code from a few places.
- Fixed example analytics app code to ensure hstore extension is registered.
- Small efficiency improvement to bloom filter.
- Removed "attention!" from README.
3.0.20
- Include schema (if specified) when checking for table-existence.
- Correct placement of ORDER BY / LIMIT clauses in compound select
queries.
- Fix bug in back-reference lookups when using filter() API.
- Fix bug in SQL generation for ON CONFLICT queries with Postgres
3.0.19
- Support for more types of mappings in insert_many()
- Lots of documentation improvements.
- Fix bug when calling tuples() on a ModelRaw query. This was reported
originally as a bug with sqlite-web CSV export
- Improved error messages when attempting to use a database class
for which the corresponding driver is not installed.
- Added tests showing the use of custom operator (a-la the docs).
- Fixed indentation issue in docs
- Fixed issue with the SQLite date_part issue
3.0.17
- Fix schema inheritance regression
- Add helper method to postgres migrator for setting search_path
3.0.16
- Improve model graph resolution when iterating results of a query
- Allow Model._meta.schema to be changed at run-time
1.0.5
- Use same schema used for reflection in generated models.
- Preserve pragmas set on deferred Sqlite database if database is
re-initialized without re-specifying pragmas.
1.0.4
- Fix bug creating model instances on Postgres when model does not
have a primary key column.
- Extend postgresql reflection to support array types.
3.0.13
- Fix bug where simple field aliases were being ignored.
- More strict about column type inference for postgres + pwiz.
3.0.12
- Fix queries of the form INSERT ... VALUES (SELECT...) so that
sub-select is wrapped in parentheses.
- Improve model-graph resolution when selecting from multiple tables
that are joined by foreign-keys, and an intermediate table is
omitted from selection.
- Docs update to reflect deletion of post_init signal.
3.0.11
- Add note to changelog about cursor() method.
- Add hash method to postgres indexedfield subclasses.
- Add TableFunction to sqlite_ext module namespace.
- Fix bug regarding NOT IN queries where the right-hand-side is an
empty set.
- Fallback implementations of bm25f and lucene search ranking
algorithms.
- Fixed DecimalField issue.
- Fixed issue with BlobField when database is a Proxy object.
- Fix Database.drop_tables() signature to support cascade argument
- Fix querying documentation for custom functions
- Added len() method to ModelBase for convenient counting.
- Fix bug related to unsaved relation population (thanks @conqp)
- Fix count() on compound select
- Support coerce keyword argument with fn.XXX()
- Support updating existing model instance with dict_to_model-like API
- Fix equality tests with ArrayField
3.0.9
- Add deprecation notice if passing autocommit as keyword argument to
the Database initializer.
- Add JSONPath and "J" helpers to sqlite extension.
3.0.8
- Add support for passing cascade=True when dropping tables.
- Fix issues with backrefs and inherited foreign-keys.
3.0.7
- Add select_extend() method to extend existing SELECT-ion.
- Accept set() as iterable value type
- Add test for model/field inheritance and fix bug relating to
recursion error when inheriting foreign-key field.
- Fix regression where consecutive calls to ModelSelect.select() with
no parameters resulted in an empty selection.
3.0.6
- Add constraints for ON UPDATE/ON DELETE to foreign-key constraint
3.0.5
- Adds Model.index(), a short-hand method for declaring ModelIndex
instances.
3.0.4
- Re-add a shim for PrimaryKeyField (renamed to AutoField) and log a
deprecation warning if you try to use it
3.0.3
- Includes fix for bug where column-name to field-name translation was
not being done when running select queries on models whose field
name differed from the underlying column name.
3.0.2
- Fixes missing pysqlite header files, which are needed to compile
certain C extensions.
3.0.0
- Complete rewrite of SQL AST and code-generation.
- Inclusion of new, low-level query builder APIs.
- List of backwards-incompatible changes since 2.x:
http://docs.peewee-orm.com/en/latest/peewee/changes.html
2.10.2
- Update travis-ci build scripts to use Postgres 9.6 and test against
Python 3.6.
- Added support for returning namedtuple objects when iterating over a
cursor.
- Added support for specifying the "object id" attribute used when
declaring a foreign key. By default, it is foreign-key-name_id, but
it can now be customized.
- Fixed small bug in the calculation of search scores when using the
SQLite C extension or the sqlite_ext module.
- Support literal column names with the dataset module.
2.10.1
- Removed AESEncryptedField.
- Remove the playhouse.fields.AESEncryptedField over security concerns
described in ticket #1264.
- Correctly resolve explicit table dependencies when creating tables, refs
- Implement not equals comparison for CompositeKey.
## 2.9.2
- Fixed significant bug in the `savepoint` commit/rollback implementation.
- Added support for postgresql `INTERVAL` columns.
- Fixed bug where missing `sqlite3` library was causing other, unrelated
libraries to throw errors when attempting to import.
- Added a `case_sensitive` parameter to the SQLite `REGEXP` function
implementation. The default is `False`, to preserve backwards-compatibility.
- Fixed bug that caused tables not to be created when using the `dataset`
extension.
- Modified `drop_table` to raise an exception if the user attempts to drop
tables with `CASCADE` when the database backend does not support it.
- Fixed Python3 issue in the `AESEncryptedField`.
- Modified the behavior of string-typed fields to treat the addition operator
as concatenation
## 2.9.1
- Fixed#1218, where the use of `playhouse.flask_utils` was requiring the
`sqlite3` module to be installed.
- Fixed#1219 regarding the SQL generation for composite key sub-selects,
joins, etc.
## 2.9.0
In this release there are two notable changes:
- The ``Model.create_or_get()`` method was removed.
- The SQLite closure table extension gained support for many-to-many
relationships thanks to a nice PR by @necoro.
## 2.8.8
This release contains a single important bugfix for a regression in specifying
the type of lock to use when opening a SQLite transaction.
## 2.8.7
This release contains numerous cleanups.
### Bugs fixed
- #1087 - Fixed a misuse of the iteration protocol in the `sqliteq` extension.
- #1096 - Fix representation of recursive foreign key relations when using the
`model_to_dict` helper.
- #1126 - Allow `pskel` to be installed into `bin` directory.
- #1105 - Added a `Tuple()` type to Peewee to enable expressing arbitrary
tuple expressions in SQL.
- #1133 - Fixed bug in the conversion of objects to `Decimal` instances in the
`DecimalField`.
- Fixed an issue renaming a unique foreign key in MySQL.
- Remove the join predicate from CROSS JOINs.
- #1148 - Ensure indexes are created when a column is added using a schema
migration.
- #1165 - Fix bug where the primary key was being overwritten in queries using
the closure-table extension.
### New stuff
- Added properties to the `SqliteExtDatabase` to expose common `PRAGMA`
settings.
- Clarified documentation on calling `commit()` or `rollback()` from within the
scope of an atomic block.
- Allow table creation dependencies to be specified using new `depends_on` meta
option.
- Allow specification of the lock type used in SQLite transactions.
- Added support for `CROSS JOIN` expressions in select queries.
- Docs on how to implement optimistic locking
- Documented optional dependencies.
- Generic support for specifying select queries as locking the selected rows
`FOR X`, e.g. `FOR UPDATE` or `FOR SHARE`.
- Support for specifying the frame-of-reference in window queries, e.g.
specifying `UNBOUNDED PRECEDING`, etc.
### Backwards-incompatible changes
- As of 9e76c99, an `OperationalError` is raised if the user calls `connect()`
on an already-open Database object. Previously, the existing connection would
remain open and a new connection would overwrite it, making it impossible to
close the previous connection. If you find this is causing breakage in your
application, you can switch the `connect()` call to `get_conn()` which will
only open a connection if necessary. The error **is** indicative of a real
issue, though, so audit your code for places where you may be opening a
connection without closing it (module-scope operations, e.g.).
2.8.5
- Starting docs on sqliteq
- Use parentheses for compound select with MySQL.
- Remove "clean_prefetch_subquery" as I'm not sure why it exists in the
first place.
2.8.4
- New playhouse extension module for working with SQLite in
multi-threaded / concurrent environments. The new module is called
playhouse.sqliteq and it works by serializing queries using a dedicated
worker thread (or greenlet). The performance is quite good, hopefully
this proves useful to someone besides myself! You can learn more by
reading the sqliteq documentation.
- #1061 - @akrs patched a bug in TimestampField which affected the
accuracy of sub-second timestamps (for resolution > 1).
- #1071, small python 3 fix.
- #1072, allow DeferredRelation to be used multiple times if there are
multiple references to a given deferred model.
- #1073, fixed regression in the speedups module that caused SQL
functions to always coerce return values, regardless of the coerce
flag.
- #1083, another Python 3 issue - this time regarding the use of
exc.message.
Bugs fixed and general changes
- #1028 - allow the ensure_join method to accept on and join_type
parameters. Thanks @paulbooth.
- #1032 - fix bug related to coercing model instances to database
parameters when the model's primary key is a foreign key.
- #1035 - fix bug introduced in 2.8.2, where I had added some
logic to try and restrict the base Model class from being
treated as a "real" Model.
- #1039 - update documentation to clarify that lists or tuples are
acceptable values when specifying SQLite PRAGMA statements.
- #1041 - PyPy user was unable to install Peewee. (Who in their
right mind would ever use PyPy?!) Bug was fixed by removing the
pre-generated C files from the distribution.
- #1043 - fix bug where the speedups C extension was not calling
the correct model initialization method, resulting in model
instances returned as results of a query having their dirty flag
incorrectly set.
- #1048 - similar to #1043, add logic to ensure that fields with
default values are considered dirty when instantiating the
model.
- #1049 - update URL to APSW.
- Fixed unreported bug regarding TimestampField with zero values
reporting the incorrect datetime.
New stuff
- djpeewee extension module now works with Django 1.9.
- TimestampField is now an officially documented field.
- #1050 - use the db_column of a ForeignKeyField for the name of
the ObjectIdDescriptor, except when the db_column and field name
are the same, in which case the ID descriptor will be named
<field_name>_id.
Bugs fixed and general cleanups
- fixed some bugs related to the Cython extension build process.
- allow blanks and perform type conversion when using the db_url
extension
- added the ability to query using the <foreign_key>_id attribute.
- ensure that peewee.OperationalError is raised consistently when
using the RetryOperationalError mixin.
- ensure that pwiz will import the appropriate extensions when
vendor-specific fields are used.
- ensure that pwiz-generated models containing UnknownField
placeholders do not blow up when you instantiate them.
- correctly limit the length of automatically-generated index
names.
- fixed bug where BlobField could not be used if it's parent model
pointed to an uninitialized database Proxy.
- greater consistency with the conversion to Python data-types
when performing aggregations, annotations, or calling scalar().
- ensure the correct data-types are used when initializing a
connection pool.
- fix bug where Signal subclasses were not returning rows affected
on save.
- added documentation about SQLite limits and how they affect
insert_many.
- better warnings regarding C extension compilation, thanks
@dhaase-de.
- fix bug where table names starting with numbers generated
invalid table names when using pwiz.
- fix bug where parameter was not being used. Thanks @jberkel.
- fixed the way SqliteExtDatabase handles the automatic rowid (and
docid) columns. Thanks for alerting me to the issue and
providing a failing test case @jberkel.
- fix obscure bug relating to cloning foreign key fields twice.
- allow set instances to be used on the right-hand side of IN
exprs.
- fix behavior where the default id primary key was inherited
regardless. When users would inadvertently include it in their
queries, it would use the table alias of it's parent class.
- add support for db_column in djpeewee
- fix the behavior of truncate_date with Postgresql. Thanks
@Zverik.
- allow DATABASE_URL as a recognized parameter to the Flask
config.
- correctly handle bytes wrapper used by PasswordField to bytes.
- when selecting and joining on multiple models, do not create
model instances when the foreign key is NULL.
- do not coerce the return value of function calls to COUNT or
SUM, since the python driver will already give us the right
Python value.
- use global state to resolve DeferredRelations, allowing for a
nicer API. Thanks @brenguyen711.
- attempt to avoid creating invalid Python when using pwiz with
MySQL database columns containing spaces. Yes, fucking spaces.
- fix bug in SQLite migrator which had a naive approach to fixing
indexes.
- explicitly check for None when determining if the database has
been set on ModelOptions. Thanks @joeyespo.
New stuff
- Added TimestampField for storing datetimes using integers.
Greater than second delay is possible through exponentiation.
- Added Database.drop_index() method.
- Added a max_depth parameter to the model_to_dict function in the
playhouse.shortcuts extension module.
- SelectQuery.first() function accepts a parameter n which applies
a limit to the query and returns the first row.
- group_by(), order_by(), window() now accept a keyward argument
extend, which, when set to True, will append to the existing
values rather than overwriting them.
- Query results support negative indexing.
- C sources are included now as part of the package. I think they
should be able to compile for python 2 or 3, on linux or
windows...but not positive.
Bugs fixed
- #821 - issue warning if Cython is old
- #822 - better handling of MySQL connections point for advanced
use-cases.
- #313 - support equality/inequality with generic foreign key
queries, and ensure get_or_create works with GFKs.
- #834 - fixed Python3 incompatibilities in the PasswordField,
thanks @mosquito.
- #836 - fix handling of last_insert_id() when using APSWDatabase.
- #845 - add connection hooks to APSWDatabase.
- #852 - check SQLite library version to avoid calls to missing
APIs.
- #857 - allow database definition to be deferred when using the
connection pool.
- #878 - formerly .limit(0) had no effect. Now adds LIMIT 0.
- #879 - implement a __hash__ method for Model
- #886 - fix count() for compound select queries.
- #895 - allow writing to the foreign_key_id descriptor to set the
foreign key value.
- #893 - fix boolean logic bug in model_to_dict().
- #904 - fix side-effect in clean_prefetch_query, thanks to
@p.kamayev
- #907 - package includes pskel now.
- #852 - fix sqlite version check in BerkeleyDB backend.
- #919 - add runtime check for sqlite3 library to match MySQL and
Postgres. Thanks @M157q
New features
- Added a number of SQLite user-defined functions and aggregates.
- Use the DB-API2 Binary type for BlobField.
- Implemented the lucene scoring algorithm in the sqlite_ext
Cython library.
- #825 - allow a custom base class for ModelOptions, providing an
extension
- #830 - added SmallIntegerField type.
- #838 - allow using a custom descriptor class with
ManyToManyField.
- #855 - merged change from @lez which included docs on using
peewee with Pyramid.
- #858 - allow arguments to be passed on query-string when using
the db_url module. Thanks @RealSalmon
- #862 - add support for truncate table, thanks @dev-zero for the
sample code.
- Allow the related_name model Meta option to be a callable that
accepts the foreign key field instance.
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.
New features
- C extension speedups now enabled by default, includes faster
implementations for dict and tuple 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.
- SQLite C extension now supports murmurhash2.
- UUIDField is now supported for SQLite and MySQL, using text and
varchar respectively, thanks @foxx!
- Added BinaryField, thanks again, @foxx!
- Added PickledField to playhouse.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.
Backwards-incompatible changes
- 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 and
Meta.extension_options to declare extension and any options.
- MySQL database will now issue COMMIT statements for SELECT queries.
Bugs fixed
- #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
- #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.
2.7.4
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 via register_database.
- prefetch() supports fetching multiple foreign-keys to the same model
class.
- Added method to validate FTS5 search queries.
2.7.3
Small release which includes some changes to the BM25 sorting
algorithm and the addition of a JSONField for use with the new
JSON1 extension.
2.7.2
Small release with bugfixes to the setup script.
I've also cleaned up some missing APIs in the FTS5Model to
support more flexible use of either FTSModel or FTS5Model.
2.7.1
Small release which includes fixes to the setup script.
Particularly, if you did not have Cython installed, the
installation would completely fail. This was fixed.
2.7.0
New APIs, features, and performance improvements.
Notable changes and new features
- PasswordField that uses the bcrypt 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 and bm25) 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 special rowid
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.
Bugs fixed
- #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.
Problems found with existing distfiles:
distfiles/D6.data.ros.gz
distfiles/cstore0.2.tar.gz
distfiles/data4.tar.gz
distfiles/sphinx-2.2.7-release.tar.gz
No changes made to the cstore or mariadb55-client distinfo files.
Otherwise, existing SHA1 digests verified and found to be the same on
the machine holding the existing distfiles (morden). All existing
SHA1 digests retained for now as an audit trail.