Changelog
Diesel 2.0.1
This is a bugfix release containing the following fixes:
- Fixed an issue with
diesel_cligenerating incompatible type names for thegenerate_missing_sql_type_definitionsfeature on PostgreSQL - Fixed an issue how
diesel_clihandles sqlite urls while checking if a given database exists - Fixed an issue with
PgConnectionbecoming unusable after hitting a database error in certain situations - Fixed an issue with diesel generating invalid SQL for certain
INSERT … ON CONFLICTqueries - Fixed
diesel_derivesgenerating code that triggers the disabled by defaultunused_qualificationslint
This release includes updated versions of diesel, diesel_cli and diesel_derives
Diesel 2.0.0
Diesel 2.0.0 contains the contributions of more than 130 people. More than 1700 commits were submitted over a span of 3 years.
As part of this release we introduced numerous new features and rewrote large parts of the internal structure. Check out our changelog for a complete list of changes. As this is a new major Diesel release it contains a number of breaking changes. Checkout our migration guide for details about how to handle those breaking changes.
This release contains the following parts:
- diesel 2.0.0-rc.0
- diesel_derives 2.0.0-rc.0
- diesel_migrations 2.0.0-rc.0
- diesel_cli 2.0.0-rc.0
- diesel_dynamic_schema 0.2.0-rc.0
This release marks a first prerelease of the upcoming Diesel 2.0 release. We ask you for your help to finalise the release. Checkout the “Timeline for a Diesel 2.0 release” section for details about how you can help us finishing the release.
Features
As a highlight Diesel 2.0.0 adds support for the following features:
- Fully type checked
GROUP BYsupport - Support for table aliasing
- Support for defining select clauses via a corresponding type
- Support for
UNION/INTERSECTqueries
Support for GROUP BY clauses
Diesel 2.0 adds support for GROUP BY clauses for select queries.
This means queries like the following one will just work.
users::table.inner_join(posts::table) .group_by(users::id) .select((users::name, count(posts::id)))As this is the case for all other Diesel built-in query dsl, this construct is fully checked at compile time. This means Diesel
will ensure that the GROUP BY clause is valid for the current query and it will also ensure that expressions appearing inside
of your SELECT clause will match the aggregation rules provided by the current GROUP BY clause.
Support for table aliasing
Diesel 2.0 adds support for table aliasing. This enables users to write queries, where a table appears more than once in the corresponding
FROM clause. For this Diesel provides a Diesel::alias! macro that allows to define new alias for existing tables.
The following query demonstrates the support for this feature:
// Define new table alias for the existing `users` tablelet users1 = diesel::alias!(schema::users as user1);
// Use the corresponding alias inside any existing queryusers::table .inner_join(users1.on(users::id).eq(users1.field(users::id)))) .select((users::id, users::name, users1.field(users::name))) .order_by(users1.field(users::id))Again all of this is checked at compile time. So similar to a normal table, columns from aliases are only allowed to appear if the corresponding query actually uses the alias.
Implied selection via the new Selectable trait
Diesel 2.0 features a new Selectable trait and derive that lets users declare that a type expects a certain kind of select clause.
The major use case for this feature is to ensure that columns from a specific query are always requested in the right order
for a corresponding type implementing Queryable. This also works for complex queries involving joins or other kinds of nesting.
#[derive(Queryable, Selectable)]struct User { id: i32, name: String,}
let first_user = users.select(User::as_select()).first(connection)?;Diesel enforces at type system level that once you provided such a select clause via User::as_select() you are only allowed
to construct this type from the returned result of the corresponding query. This means there is no need to specify the User type
twice in the query above.
Support for UNION/INTERSECT/EXCEPT queries
Diesel 2.0 extents the query builder to support query combinations via UNION/INTERSECT/EXCEPT. This allows you
to easily chain multiple queries together as long as they return fields of the same type. Queries like the following
one are now supported:
users.select(user_name.nullable()) .union(animals.select(animal_name).filter(animal_name.is_not_null()))As always this is checked at compile time to reject invalid queries, like for example that ones containing select clauses with different fields.
Call for Participation
The release of Diesel 2.0 does not only include the features listed above, but also marks the point where the following things can be provided by third party crates:
- Custom
QueryDslextensions to support previously unsupported SQL features. Checkoutdiesel_full_text_searchfor an example - Alternative query dsl implementations reusing the existing
Connectioninfrastructure - Custom
Connectionimplementations for existing backends - Custom
ConnectionandBackendimplementations for previously unsupported backends. Checkout diesel-oci for an example.
We encourage our community to try out those features. Especially we would like to see experimentation around:
- Previously unsupported database backends
- Pure rust implementations of existing backend implementations. Checkout this and this discussion for starting points.
- Alternative query dsl implementations. Checkout this discussion as starting point.
Please get in touch with us for pointers, help and details.
Input for Future Roadmap
With the release of Diesel 2.0 the planing for our next releases start. Hopefully they will not take as long as Diesel 2.0. We are looking for input on which features are wanted by our community. Please open a discussion thread with your idea in our discussion forum.
Weiznich will work on improving error messages for trait heavy crates based on a Rust Foundation Project Grant. This work will hopefully improve error messages for Diesel as well. If you are aware of bad error messages please submit a minimal example here.
Thanks
As part of this release we would like to welcome @Ten0 as part of the diesel core team.
Thank you to everyone who helped make this release happen through bug reports, and discussion on Gitter. While we don’t have a way to collect stats on that form of contribution, it’s greatly appreciated.
In addition to the Diesel core team, 141 people contributed code to this release. A huge thank you to:
- Alessandro Menezes
- Alexander ‘z33ky’ Hirsch
- Alexei Pastuchov
- Alice Ryhl
- Amila Welihinda
- Andre Braga Reis
- Andreas Runfalk
- Andrew Safigan
- Andrew Speed
- Andy Russell
- Artem Vorotnikov
- Arve Seljebu
- Billy Chan
- Blas Rodriguez Irizar
- Bryan Henry
- Callym
- Caroline Glassberg-Powell
- Cassie Jones
- Chenxi Yuan
- Chris Eckhardt
- Chris Hanks
- Chris Maddox
- Chris West (Faux)
- Clouds Flowing
- Corentin Henry
- Daniel Buse
- Danilo Bargen
- David Teller
- David Tulig
- DebugSteven
- Diggory Blake
- Dmitriy Pleshevskiy
- Dusty Mabe
- DrVilepis
- EclipsedSolari
- Emile Fugulin
- Emm
- Emmanuel Surleau
- Erlend Langseth
- Felix Watts
- Filip Gospodinov
- Garrett Thornburg
- Giorgio Gambino
- Grégory Obanos
- Hal Gentz
- Han Xu
- Heliozoa
- Henk van der Laan
- Henry Boisdequin
- Hirokazu Hata
- Iban Eguia (Razican)
- Igor Raits
- Ivan Tham
- JR Heard
- Jean SIMARD
- Jeremy Stucki
- Jiří Sejkora
- jigaoqiang
- Joel Parker Henderson
- John Brandt
- Jonas Platte
- Jonas Schievink
- Joshua Koudys
- Juhasz Sandor
- Justice4Joffrey
- Katharina Fey
- Kevin King
- Kevin Kirchner
- Khionu Sybiern
- Kitsu
- Koisell
- Kononnable
- Leonardo Yvens
- Lukas Markeffsky
- Maccesch
- Marc-Stefan Cassola
- Martell Malone
- Martijn Groeneveldt
- Martin Nordholts
- Matthew Kuo
- Matthieu Guillemot
- Mcat12
- Meven
- Mike Cronce
- Mr Ceperka
- Nafiul Islam
- Nathan Papapietro
- Nicholas Yang
- Oliver Cooper
- Otto Castle
- Pankaj Jangid
- Paolo Barbolini
- Paul Le Corre
- Paul Martensen
- Pavan Kumar Sunkara
- Paweł Przeniczny
- Philip Trauner
- Raphael Arias
- Roman
- Ryan Leckey
- Sarthak Singh
- Scott Driggers
- Sean Klein
- Simon Ertl
- Spencer Taylor
- Steven Chu
- Storm Timmermans
- Sébastien Santoro
- Takayuki Maeda
- Thomas Constantine Moore
- Thomas Eizinger
- Thomas Etter
- Tom MacWright
- Tuetuopay
- Urhengulas
- Vanio Begic
- WebeWizard
- William Myers
- Yin Jifeng
- Yuki Okushi
- Zane Duffield
- blackghost1987
- czotomo
- dchenk
- ejc Drobnič
- gorbit99
- hasezoey
- hi-rustin
- kevinpoitra
- kpcyrd
- matthew-dowdell
- ode79
- ropottnik
- telios
- theredfish
- zoewithabang
- Zhenhui Xie
- Émile Fugulin
- κeen
- 二手掉包工程师
- 棒棒彬_Binboy
1.4.8
This release fixes an incompatibility between features passed to diesel and diesel_migrations while using cargos new resolver feature (resolver = "2") which will become the new default with the upcoming Rust 2021 edition
1.4.7
- Updated
libsqlite3-systo allow version 0.22 - Updated
ipnetworkto allow version 0.18
1.4.6
Fixed
- Fixed a use-after-free issue in the
QueryableByNameimplementation of ourSqlitebackend - Updated several dependencies
1.4.5
Fixed
- Update several dependencies
- Fixed an issue where transactions that would fail to commit would leave the connection in a broken non-committed non-rolled-back state.
- Fix a bug that result in leaking sockets/file descriptors on failed connection attempts for postgresql
- Fix an incompatibility with newer
libmysqlclientversions - Remove some potential harmful usages of
mem::uninitialized
1.4.4
Fixed
- Update several dependencies
- Fixed a bug with printing embedded migrations
As part of this release also updated versions of migration_internals and migration_macros are published.
1.4.3
Fixed
- Updated several dependencies
- Fixed an issue where the postgresql backend exploits implementation defined behaviour
- Fixed issue where rustdoc failed to build the documentation
diesel_derivesanddiesel_migrationsare updated to syn 1.0
v1.4.0
New Features
In contrast to the last release most changes in this release are minor or internal. We’ve added support for newer versions of some dependency crates (libsqlite-sys, uuid, ipnetwork).
Diesel CLI got a command line flag to check if a generated schema matches the already existing one. This is useful for CI setups to check there if the committed generated schema file matches the committed migrations.
We’ve added support for the diesel_mange_updated_at('table_name') SQL function on SQLite. This function handles the setup of an trigger that automatically updates the updated_at column on update operations.
Additionally several helpers were added to support the deserialisation of tuples and composite types on PostgreSQL.
As always, a full list of changes can be found it in the changelog
Thanks
Thank you to everyone who helped make this release happen through bug reports, and discussion on Gitter. While we don’t have a way to collect stats on that form of contribution, it’s greatly appreciated.
In addition to the Diesel core team, 29 people contributed code to this release. A huge thank you to:
- Aleksey Ivanov
- Andrew Speed
- Carlos Diaz-Padron
- Daniel Silverstone
- Dirkjan Ochtman
- Dominik Sander
- Eyal Kalderon
- Galuh Sahid
- Hirokazu Hata
- Jake Goulding
- Jo Liss
- Josh Leeb-du Toit
- Kevin Stenerson
- kpcyrd
- Marcus Stollsteimer
- Matej Stuchlik
- Nikita Sivakov
- notryanb
- Rasmus Kaj
- Richard Petrie
- Rotem Yaari
- Ryan Leckey
- Sergio Benitez
- Simon Heath
- Stephen Muss
- Trinh Hoang Anh
1.3.3
This is a small bugfix release, addressing an issue with MySQL 8.0. The behavior of the C API in libmysqlclient changed in this version of MySQL, causing problems when a connection pool was used with Diesel.
If you are not using MySQL, or are on a version older than 8.0, this release does not affect you.