All user visible changes to this project will be documented in this file. This project adheres to Semantic Versioning, as described for Rust libraries in RFC #1105
embed_migrations!
will no longer emit an unused import warning- Diesel now supports uuid 0.7 by adding the new feature flag
uuidv07
-
Diesel CLI can be configured to error if a command would result in changes to your schema file by passing
--locked-schema
. This is intended for use in CI and production deploys, to ensure that the committed schema file is up to date. -
A helper trait has been added for implementing
ToSql
for PG composite types. SeeWriteTuple
for details.
-
Added support for MySQL's
UNSIGNED TINYINT
-
DatabaseErrorKind::SerializationFailure
has been added, corresponding to SQLSTATE code 40001 (ASERIALIZABLE
isolation level transaction failed to commit due to a read/write dependency on another transaction). This error is currently only detected on PostgreSQL. -
Diesel CLI can now generate completions for zsh and fish. See
diesel completions --help
for details. -
#[belongs_to]
can now accept types that are generic over lifetimes (for example, if one of the fields has the typeCow<'a, str>
). To define an association to such a type, write#[belongs_to(parent = "User<'_>")]
-
Nullable<Text>
now supportsilike
expression on in PostgreSQL. -
diesel_manage_updated_at('table_name')
is now available on SQLite. This function can be called in your migrations to create a trigger which automatically sets theupdated_at
column, unless that column was updated in the query.
-
Diesel's derives now require that
extern crate diesel;
be at your crate root (e.g.src/lib.rs
orsrc/main.rs
) -
Tinyint
has been renamed toTinyInt
and an alias has been created fromTinyint
toTinyInt
. -
The minimal officially supported rustc version is now 1.31.0
1.3.3 - 2018-09-12
- Fixed an issue that occurred with MySQL 8.0 when calling
.execute
or.batch_execute
with a single query that returned a result set (such as ourSELECT 1
health check inr2d2
).
1.3.2 - 2018-06-13
-
The behavior of unsigned types in MySQL has been corrected to properly set the
is_unsigned
flag. -
Fixed an issue with
sql_function!
when#[sql_name]
was used on functions with no return type.
1.3.1 - 2018-05-23
- Fixed an issue with Diesel CLI's use of temp files that caused errors on Windows.
1.3.0 - 2018-05-22
-
Diesel CLI now supports a configuration file. See diesel.rs/guides/configuring-diesel-cli for details.
-
sql_function!
now supports generic functions. See the documentation forsql_function!
for more details. -
sql_function!
now supports aggregate functions likesum
andmax
, by annotating them with#[aggregate]
. This skips the implementation ofNonAggregate
for your function. See the documentation forsql_function!
for more details. -
sql_function!
now supports renaming the function by annotating it with#[sql_name = "SOME_FUNCTION"]
. This can be used to support functions with multiple signatures such as coalesce, by defining multiple rust functions (with different names) that have the same#[sql_name]
. -
Added
sqlite-bundled
feature todiesel_cli
to make installing on some platforms easier. -
Custom SQL functions can now be used with SQLite. See the docs for details.
-
All functions and operators provided by Diesel can now be used with numeric operators if the SQL type supports it.
-
PgInterval
can now be used with-
,*
, and/
. -
Vec<T>
is nowInsertable
. It is no longer required to always place an&
in front of.values
. -
Added support for PG tuples. See
sql_types::Record
for details.
- Added support for a wider range of locking clauses, including
FOR SHARE
,SKIP LOCKED
,NO WAIT
, and more. SeeQueryDsl
for details.
sql_function!
has been redesigned. The syntax is nowsql_function!(fn lower(x: Text) -> Text);
. The output of the new syntax is slightly different than what was generated in the past. See the documentation forsql_function!
for more details.
- Diesel's minimum supported Rust version is 1.24.0. This was already true, but it is now tested and enforced. Any future changes to our minimum supported version will be listed in this change log.
diesel print-schema
andinfer_schema!
now properly handle unsigned types in MySQL
-
diesel_infer_schema
has been deprecated.diesel print-schema
is now the only way to generate database schema. Diesel CLI can be configured to automatically regenerate your schema file when migrations are run. See diesel.rs/guides/configuring-diesel-cli for details. -
Uses of
sql_function!
in the formsql_function!(foo, foo_t, (x: Integer))
have been deprecated in favor of a new design (listed above). Note: Due to a bug in Rust, you may not see a deprecation warning from usage of the old form. As always, if you're concerned about relying on deprecated code, we recommend attempting to build your app withdefault-features
turned off (specifically excluding thewith-deprecated
feature). -
The
--whitelist
and--blacklist
options todiesel print-schema
have been deprecated and renamed--only-tables
and--exclude-tables
.
1.2.2 - 2018-04-12
- Warnings are now allowed inside the crate. The way we had attempted to deprecate old feature names caused builds to break. We are still not happy with how this deprecation gets communicated, and will revisit it in the future.
1.2.1 - 2018-04-11
- Renamed
x32-column-tables
,x64-column-tables
, andx128-column-tables
to32-column-tables
,64-column-tables
, and128-column-tables
. The leadingx
was due to a bug in crates.io discovered while publishing 1.2.0. The bug has since been fixed.
1.2.0 - 2018-04-06
-
Added
SqlLiteral::bind()
. This is intended to be used for binding values to small SQL fragments. Usesql_query
if you are writing full queries. -
Added support for
INSERT INTO table (...) SELECT ...
queries. Tables, select select statements, and boxed select statements can now be used just like any otherInsertable
value. -
Any insert query written as
insert_into(table).values(values)
can now be written asvalues.insert_into(table)
. This is particularly useful when inserting from a select statement, as select statements tend to span multiple lines. -
Diesel's derives can now produce improved error messages if you are using a nightly compiler, and enable the
unstable
feature. For the best errors, you should also setRUSTFLAGS="--cfg procmacro2_semver_exempt"
. -
Added support for specifying
ISOLATION LEVEL
,DEFERRABLE
, andREAD ONLY
on PG transactions. SeePgConnection::build_transaction
for details.
- Added support for
BEGIN IMMEDIATE
andBEGIN EXCLUSIVE
on SQLite. SeeSqliteConnection::immediate_transaction
andSqliteConnection::exclusive_transaction
for details
-
Tables with more than 56 columns are now supported by enabling the
128-column-tables
feature. -
Delete statements can now be boxed. This is useful for conditionally modifying the where clause of a delete statement. See
DeleteStatement::into_boxed
for details.
- Update statements can now be boxed. This is useful for conditionally modifying
the where clause of a update statement. See
UpdateStatement::into_boxed
for details.
-
Added
order_by
as an alias fororder
. -
Added
then_order_by
, which appends to anORDER BY
clause rather than replacing it. This is useful with boxed queries to dynamically construct an order by clause containing an unknown number of columns. -
#[derive(Insertable)]
can now work on structs with fields that implementInsertable
(meaning one field can map to more than one column). Add#[diesel(embed)]
to the field to enable this behavior. -
Queries that treat a subselect as a single value (e.g.
foo = (subselect)
) are now supported by calling.single_value()
. -
#[derive(Insertable)]
implements nowInsertable
also on the struct itself, not only on references to the struct
-
ConnectionError
now implementsPartialEq
. -
Columns generated by
table!
now implementDefault
-
#[derive(AsChangeset)]
now implementsAsChangeset
on the struct itself, and not only on a reference to the struct -
Added support for deserializing
Numeric
intoBigDecimal
on SQLite. SQLite has no arbitrary precision type, so the result will still have floating point rounding issues. This is primarily to support things likeavg(int_col)
, which we define as returningNumeric
-
The bounds on
impl ToSql for Cow<'a, T>
have been loosened to no longer require thatT::Owned: ToSql
. -
32-column-tables
are now enabled by default.
-
ne_any
has been renamed tone_all
. -
The
large-tables
feature has been has been renamed to32-column-tables
. -
The
huge-tables
feature has been renamed to64-column-tables
. -
IncompleteUpdateStatement
has been removed. UseUpdateStatement
instead.
-
diesel database setup
now correctly handles database URLs containing query strings -
diesel migration list
shows the proper migration order when mixing old and new timestamp formats. (The migrations were always run in the correct order, this only affects the display logic ofmigration list
) -
#[derive(Identifiable)]
now correctly associates#[primary_key]
with the column name, not field name. -
Select statements can no longer incorrectly appear in an expression context.
-
exists
can no longer incorrectly receive values other than select statements. -
MysqlConnection::establish
can now properly handle IPv6 addresses wrapped in square brackets.
- Diesel is now powered by the blockchain because it's 2018.
1.1.2 - 2018-04-05
- No changes
1.1.1 - 2018-01-16
- Added
diesel::r2d2::PoolError
as an alias forr2d2::Error
. Previously this type was inaccessible due todiesel::r2d2::Error
.
1.1.0 - 2018-01-15
-
r2d2-diesel
has been merged into Diesel proper. You should no longer rely directly onr2d2-diesel
orr2d2
. The functionality of both is exposed fromdiesel::r2d2
. -
r2d2::PooledConnection
now implementsConnection
. This means that you should no longer need to write&*connection
when usingr2d2
. -
The
BINARY
column type name is now supported for SQLite. -
The
QueryId
trait can now be derived. -
FromSqlRow
can now be derived for types which implementFromSql
. -
AsExpression
can now be derived for types which implementToSql
. -
HasSqlType
,NotNull
, andSingleValue
can now be derived with#[derive(SqlType)]
. See the docs for those traits for more information. -
The return type of
FromSql
,FromSqlRow
, andQueryableByName
can now be written asdeserialize::Result<Self>
. -
The return type of
ToSql
can now be written asserialize::Result
. -
Added support for SQLite's
INSERT OR IGNORE
and MySQL'sINSERT IGNORE
via theinsert_or_ignore
function. -
min
andmax
can now be used with array expressions. -
Added
diesel::dsl::array
, which corresponds to a PGARRAY[]
literal. -
Added the
not_none!
macro, used by implementations ofFromSql
which do not expectNULL
. -
Added
result::UnexpectedNullError
, anError
type indicating that an unexpectedNULL
was received during deserialization. -
Added
.or_filter
, which behaves identically to.filter
, but usingOR
instead ofAND
. -
helper_types
now contains a type for every method defined inexpression_methods
, and every function indsl
. -
Added
FromSql
impls for*const str
and*const [u8]
everywhere thatString
andVec
are supported. These impls do not allocate, and are intended for use by other impls which need to parse a string or bytes, and don't want to allocate. These impls should never be used outside of anotherFromSql
impl.
- IMPORTANT NOTE Due to several
bugs in Rust, many of the deprecations in this
release may not show a warning. If you want to ensure you are not using any
deprecated items, we recommend attempting to compile your code without the
with-deprecated
feature by addingdefault-features = false
toCargo.toml
.
-
Deprecated
impl_query_id!
in favor of#[derive(QueryId)]
-
Deprecated specifying a column name as
#[column_name(foo)]
.#[column_name = "foo"]
should be used instead. -
The
types
module has been deprecated. It has been split intosql_types
,serialize
, anddeserialize
. -
query_source::Queryable
andquery_source::QueryableByName
have been deprecated. These traits have been moved todeserialize
. -
backend::TypeMetadata
has been deprecated. It has been moved tosql_types
. -
types::ToSqlOutput
has been deprecated. It has been renamed toserialize::Output
. -
helper_types::Not
is nowhelper_types::not
infer_schema!
generates valid code when run against a database with no tables.
1.0.0 - 2018-01-02
-
#[derive(QueryableByName)]
can now handle structs that have no associated table. If the#[table_name]
annotation is left off, you must annotate each field with#[sql_type = "Integer"]
-
#[derive(QueryableByName)]
can now handle embedding other structs. To have a field whose type is a struct which implementsQueryableByName
, rather than a single column in the query, add the annotation#[diesel(embed)]
-
The
QueryDsl
trait encompasses the majority of the traits that were previously in thequery_dsl
module.
-
Executing select statements on SQLite will no longer panic when the database returns
SQLITE_BUSY
-
table!
s which use theDatetime
type with MySQL will now compile correctly, even without thechrono
feature enabled. -
#[derive(QueryableByName)]
will now compile correctly when there is a shadowedResult
type in scope. -
BoxableExpression
can now be used with types that are not'static
-
Connection::test_transaction
now requires that the error returned implementDebug
. -
query_builder::insert_statement::InsertStatement
is now accessed asquery_builder::InsertStatement
-
query_builder::insert_statement::UndecoratedInsertRecord
is now accessed asquery_builder::UndecoratedInsertRecord
-
#[derive(QueryableByName)]
now requires that the table name be explicitly stated. -
Most of the traits in
query_dsl
have been moved toquery_dsl::methods
. These traits are no longer exported inprelude
. This should not affect most apps, as the behavior of these traits is provided byQueryDsl
. However, if you were using these traits inwhere
clauses for generic code, you will need to explicitly douse diesel::query_dsl::methods::WhateverDsl
. You may also need to use UFCS in these cases. -
If you have a type which implemented
QueryFragment
orQuery
, which you intended to be able to callexecute
orload
on, you will need to manually implementRunQueryDsl
for that type. The trait should be unconditionally implemented (no where clause beyond what your type requires), and the body should be empty.
-
All deprecated items have been removed.
-
LoadDsl
andFirstDsl
have been removed. Their functionality now lives inLoadQuery
.
0.99.1 - 2017-12-01
- Diesel CLI now properly restricts its
clap
dependency. 0.99.0 mistakenly had no upper bound on the version.
0.99.0 - 2017-11-28
-
The
.for_update()
method has been added to select statements, allowing construction ofSELECT ... FOR UPDATE
. -
Added
insert_into(table).default_values()
as a replacement forinsert_default_values()
-
Added
insert_into(table).values(values)
as a replacement forinsert(values).into(table)
. -
Added support for MySQL's
REPLACE INTO
asreplace_into(table)
. -
Added
replace_into(table).values(values)
as a replacement forinsert_or_replace(values).into(table)
. -
Added
on_conflict_do_nothing
onInsertStatement
as a replacement foron_conflict_do_nothing
onInsertable
structs. -
Added
on_conflict
onInsertStatement
as a replacement foron_conflict
onInsertable
structs. -
filter
can now be called on update and delete statements. This means that instead ofupdate(users.filter(...))
you can writeupdate(users).filter(...)
. This allows line breaks to more naturally be introduced. -
Subselects can now reference columns from the outer table. For example,
users.filter(exists(posts.filter(user_id.eq(users::id))))
will now compile. -
TextExpressionMethods
is now implemented for expressions of typeNullable<Text>
as well asText
. -
allow_tables_to_appear_in_same_query!
can now take more than 2 tables, and is the same as invoking it separately for every combination of those tables. -
Added
sql_query
, a new API for dropping to raw SQL that is more pleasant to use thansql
for complete queries. The main difference fromsql
is that you do not need to state the return type, and data is loaded from the query by name rather than by index. -
Added a way to rename a table in the
table!
macro with#[sql_name="the_table_name"]
-
Added support for PostgreSQL's
DISTINCT ON
. See.distinct_on()
for more details
-
The signatures of
QueryId
,Column
, andFromSqlRow
have all changed to use associated constants where appropriate. -
You will now need to invoke
allow_tables_to_appear_in_same_query!
any time two tables appear together in the same query, even if there is ajoinable!
invocation for those tables. -
diesel_codegen
should no longer explicitly be used as a dependency. Unless you are usinginfer_schema!
orembed_migrations!
, you can simply remove it from yourCargo.toml
. All other functionality is now provided bydiesel
itself. -
Code using
infer_schema!
orinfer_table_from_schema!
must now adddiesel_infer_schema
toCargo.toml
, and#[macro_use] extern crate diesel_infer_schema
tosrc/lib.rs
-
Code using
embed_migrations!
must now adddiesel_migrations
toCargo.toml
, and#[macro_use] extern crate diesel_migrations
tosrc/lib.rs
-
The
migrations
module has been moved out ofdiesel
and intodiesel_migrations
-
Deprecated
insert_default_values()
in favor ofinsert_into(table).default_values()
-
Deprecated
insert(values).into(table)
in favor ofinsert_into(table).values(values)
. -
Deprecated
insert_or_replace(values).into(table)
in favor ofreplace_into(table).values(values)
. -
Deprecated
.values(x.on_conflict_do_nothing())
in favor of.values(x).on_conflict_do_nothing()
-
Deprecated
.values(x.on_conflict(y, do_nothing()))
in favor of.values(x).on_conflict(y).do_nothing()
-
Deprecated
.values(x.on_conflict(y, do_update().set(z)))
in favor of.values(x).on_conflict(y).do_update().set(z)
-
Deprecated
enable_multi_table_joins
in favor ofallow_tables_to_appear_in_same_query!
-
Deprecated
SqlLiteral#bind
.sql
is intended for use with small fragments of SQL, not complete queries. Writing bind parameters in raw SQL when you are not writing the whole query is error-prone. Usesql_query
if you need raw SQL with bind parameters.
-
IntoInsertStatement
andBatchInsertStatement
have been removed. It's unlikely that your application is using these types, butInsertStatement
is now the only "insert statement" type. -
Citext
as a type alias forText
has been removed. Writingcitext_column.eq("foo")
would perform a case-sensitive comparison. More fleshed out support will be required.
-
When using MySQL and SQLite, dates which cannot be represented by
chrono
(such as0000-00-00
) will now properly return an error instead of panicking. -
MySQL URLs will now properly percent decode the username and password.
-
References to types other than
str
and slice can now appear on structs which deriveInsertable
orAsChangeset
. -
Deserializing a date/time/timestamp column into a chrono type on SQLite will now handle any value that is in a format documented as valid for SQLite's
strftime
function except for the string'now'
.
0.16.0 - 2017-08-24
-
Added helper types for inner join and left outer join
-
diesel::debug_query
has been added as a replacement fordebug_sql!
. This function differs from the macro by allowing you to specify the backend, and will generate the actual query which will be run. The returned value will implementDisplay
andDebug
to show the query in different ways -
diesel::pg::PgConnection
,diesel::mysql::MysqlConnection
, anddiesel::sqlite::SqliteConnection
are now exported fromdiesel::prelude
. You should no longer need to import these types explicitly. -
Added support for the Decimal datatype on MySQL, using the BigDecimal crate.
-
Added support for the Range type on postgreSQL.
-
Added support for the Datetime type on MySQL.
-
Added support for the Blob type on MySQL.
-
infer_schema!
will now automatically detect which tables can be joined based on the presence of foreign key constraints. -
Added support for
Add
andSub
to timestamp types. -
Added a way to rename columns in the table macro with
#[sql_name="the_column_name"]
-
Schema inference now also generates documentation comments for tables and columns. For
infer_schema!
, this is enabled by default. If you are using Diesel's CLI tool, pass the new--with-docs
parameter:diesel print-schema --with-docs
. -
infer_schema!
now automatically renames columns that conflict with a Rust keyword by placing a _ at the end of the name. For example, a column calledtype
will be referenced astype_
in Rust.
-
The deprecated
debug_sql!
andprint_sql!
functions will now generate backend specific SQL. (The specific backend they will generate for will be arbitrarily chosen based on the backends enabled). -
#[belongs_to]
will no longer generate the code required to join between two tables. You will need to explicitly invokejoinable!
instead, unless you are usinginfer_schema!
-
Changed the migration directory name format to
%Y-%m-%d-%H%M%S
. -
between
andnot_between
now take two arguments, rather than a range.
-
debug_sql!
has been deprecated in favor ofdiesel::debug_query
. -
print_sql!
has been deprecated without replacement. -
diesel::backend::Debug
has been removed.
-
Diesel now properly supports joins in the form:
grandchild.join(child.join(parent))
. Previously onlyparent.join(child.join(grandchild))
would compile. -
When encoding a
BigDecimal
on PG,1.0
is no longer encoded as if it were1
.
0.15.2 - 2017-07-28
BigDecimal
now properly encodes numbers starting with10000
on postgres. See issue #1044 for details.
0.15.1 - 2017-07-24
- No changes to public API
0.15.0 - 2017-07-23
-
Added support for the PG
IS DISTINCT FROM
operator -
The
ON
clause of a join can now be manually specified. See the docs for details.
-
Diesel will now automatically invoke
numeric_expr!
for your columns in the common cases. You will likely need to delete any manual invocations of this macro. -
Insertable
no longer treats all fields as nullable for type checking. What this means for you is that if you had an impl likeimpl AsExpression<Nullable<SqlType>, DB> for CustomType
in your code base, you can remove theNullable
portion (Unless you are using it with fields that are actually nullable) -
Connections will now explicitly set the session time zone to UTC when the connection is established
0.14.1 - 2017-07-10
- The return type of
sum
andavg
is now always considered to beNullable
, as these functions returnNULL
when against on an empty table.
0.14.0 - 2017-07-04
- Added support for joining between more than two tables. The query builder can
now be used to join between any number of tables in a single query. See the
documentation for
JoinDsl
for details
-
Added support for the PostgreSQL network types
MACADDR
. -
Added support for the Numeric datatypes, using the BigDecimal crate.
-
Added a function which maps to SQL
NOT
. See the docs for more details. -
Added the
insert_default_values
function.
- Added
diesel_prefix_operator!
which behaves identically todiesel_postfix_operator!
(previouslypostfix_predicate!
), but for operators likeNOT
which use prefix notation.
-
infix_predicate!
andinfix_expression!
have been renamed todiesel_infix_operator!
. -
postfix_predicate!
andpostfix_expression!
have been renamed todiesel_postfix_operator!
. -
Trait bounds along the lines of
T: LoadDsl<Conn>, U: Queryable<T::SqlType, Conn::Backend>
should be changed toT: LoadQuery<Conn, U>
. -
Diesel now uses a migration to set up its timestamp helpers. To generate this migration for your project, run
diesel database setup
.
#[has_many]
has been removed. Its functionality is now provided by#[belongs_to]
on the child struct. If there is no child struct to put#[belongs_to]
on, you can invokejoinable!
directly instead.
0.13.0 - 2017-05-15
-
Added support for chrono types with SQLite.
-
Bind values can now be supplied to queries constructed using raw SQL. See the docs for more details.
- Added support for the PostgreSQL network types
CIDR
andINET
.
-
Added support for
ILIKE
in PostgreSQL. -
diesel migration list
will show all migrations, marking those that have been run. -
diesel migration pending
will list any migrations which have not been run. -
Added support for numeric operations with nullable types.
-
Diesel CLI now respects the
--migration-dir
argument or theMIGRATION_DIRECTORY
environment variable for all commands. -
Diesel CLI now properly escapes the database name.
0.12.1 - 2017-05-07
- Locked the chrono dependency to require exactly
0.3.0
instead of a semver restriction. This restriction is required for the 0.12 line of releases to continue compiling, as the chrono project is including breaking changes in patch releases.
0.12.0 - 2017-03-16
- Added support for the majority of PG upsert (
INSERT ON CONFLICT
). We now support specifying the constraint, as well asDO UPDATE
in addition toDO NOTHING
. See the module docs for details.
- Added support for the SQL concatenation operator
||
. See the docs for.concat
for more details.
- Added support for the PostgreSQL
Money
type.
-
Diesel CLI: Added
db
as an alias fordatabase
, so you can now writediesel db setup
(which is almost 40% faster!). -
The
table!
macro now allows you to use types from crates outside of Diesel. You can specify where types should be imported from by doing:table! { use some_modules::*; foo { columns... }
. Not specifying any any modules is equivalent touse diesel::types::*;
.
-
diesel_codegen
will provide a more useful error message when it encounters an unsupported type that contains a space in MySQL. -
#[derive(AsChangeset)]
will now respect custom#[primary_key]
annotations, and avoid setting those columns.
-
WithDsl
andAliased
have been removed. They were a feature that was actually closer to a cross join than the names implied, and wasn't fully thought out. The functionality they provided will return as joins are further revamped. -
The internal use macro
select_column_workaround!
has been removed. If you were relying on this internal macro, you can simply delete the line that was calling it. -
Columns from the right side of a left join will now need to have
.nullable()
explicitly called to be passed to.select
. This allows it to compose better with functions that don't normally take nullable columns (e.g.lower(name).nullable()
).
0.11.4 - 2017-02-21
- Corrected a memory safety violation when using MySQL.
- No changes
0.11.2 - 2017-02-19
pq-sys
andmysqlclient-sys
will no longer attempt to generate bindings at compile time. Generating the bindings required a bleeding edge version of clang, which caused too many issues.
0.11.1 - 2017-02-17
-
.on_conflict_do_nothing()
now interacts with slices properly. -
MysqlConnection
now implementsSend
, which is required for connection pooling.
0.11.0 - 2017-02-16
- Added support for MySQL as an additional backend. Diesel CLI will install with
MySQL support by default. To enable it for Diesel and Diesel Codegen, add
features = ["mysql"]
to Cargo.toml. See the docs for details.
- Added support for PG's
ON CONFLICT DO NOTHING
clause. See the docs for details.
- Queries constructed using
diesel::select
now work properly when boxed.
-
Arrays containing null are now supported.
infer_schema!
will never infer an array that contains null, but atable!
definition which specifies a type ofArray<Nullable<X>>
can now be deserialized toVec<Option<T>>
-
#[belongs_to]
associations can now be self referential. This will generate the code required forbelonging_to
, without generating code for performing a join.
- Added support for the
rust-lang-deprecated/time
crate on PostgreSQL. To use it, addfeatures = ["deprecated-time"]
-
It is no longer possible to exhaustively match against
result::ConnectionError
. -
Updated chrono to version 0.3.
-
max
andmin
are now always nullable. The database will returnNULL
when the table is empty.
now
can now be used as an expression of typeTimestamptz
.
Connection::transaction
now returns your error directly instead of wrapping it inTransactionError
. It requires that the error implementFrom<diesel::result::Error>
- The way tuples of columns from the right side of left outer joins interact
with
.select
has changed. If you are deserializing into an option of a tuple (instead of a tuple of options), you will need to explicitly call.nullable()
. (e.g..select(users::name, (posts::title, posts::body).nullable())
)
result::TransactionError
result::TransactionResult
0.10.1 - 2017-02-08
infer_table_from_schema!
properly handles table names with a custom schema specified.
- Updated uuid to version 0.4.
0.10.0 - 2017-02-02
- Added support for the PostgreSQL
json
andjsonb
types. They can be mapped to/fromserde_json::Value
. Theserde
feature must be enabled to use the JSON types.
- Added the
print-schema
command to Diesel CLI. This command will print the output of theinfer_schema!
macro. For more information rundiesel help print-schema
.
-
When possible, we will use deprecation warnings for breaking changes. Deprecated code requires the
with-deprecated
feature, which is enabled by default. -
The
postgres
feature is no longer enabled by default bydiesel
ordiesel_codegen_syntex
. Addfeatures = ["postgres"]
to yourCargo.toml
. -
The
persistable
module has been renamed toinsertable
.
#[derive(Insertable)]
allows fields of typeOption<T>
to be used with columns that are not null if they have a default value.
-
diesel_codegen_syntex
is no longer supported.diesel_codegen
can now be used on stable Rust. -
Dropped support for Rust 1.14 and earlier
0.9.1 - 2016-12-09
-
Added missing impls for loading
chrono::NaiveDateTime
from a column of typeTimestamptz
-
#[derive(AsChangeset)]
no longer assumes thatuse diesel::prelude::*
has been done. -
debug_sql!
can now properly be used with types fromchrono
orstd::time
. -
When using PostgreSQL, attempting to get the error message of a query which could not be transmitted to the server (such as a query with greater than 65535 bind parameters) will no longer panic.
0.9.0 - 2016-12-08
-
Added support for SQL
NOT IN
using thene_any
method. -
The
table!
macro now allows custom schemas to be specified. Example:table! { schema_1.table_1 { id -> Integer, } }
The generated module will still be called
table_1
. -
The
infer_table_from_schema!
macro now allows custom schemas to be specified. Example:infer_table_from_schema!("dotenv:DATABASE_URL", "schema_1.table_1");
-
The
infer_schema!
optionally allows a schema name as the second argument. Any schemas other thanpublic
will be wrapped in a module with the same name as the schema. For example,schema_1.table_1
would be referenced asschema_1::table_1
. -
Added support for batch insert on SQLite. This means that you can now pass a slice or vector to
diesel::insert
on all backends.
- Added a function for SQL
EXISTS
expressions. Seediesel::expression::dsl::exists
for details.
#[derive(Identifiable)]
can be used with structs that have primary keys other thanid
, as well as structs with composite primary keys. You can now annotate the struct with#[primary_key(nonstandard)]
or#[primary_key(foo, bar)]
.
- All macros with the same name as traits we can derive (e.g.
Queryable!
) have been renamed toimpl_Queryable!
or similar.
-
#[derive(Identifiable)]
now works on structs with lifetimes -
Attempting to insert an empty slice will no longer panic. It does not execute any queries, but the result will indicate that we successfully inserted 0 rows.
-
Attempting to update a record with no changes will no longer generate invalid SQL. The result of attempting to execute the query will still be an error, but but it will be a
Error::QueryBuilderError
, rather than a database error. This means that it will not abort the current transaction, and can be handled by applications. -
Calling
eq_any
orne_any
with an empty array no longer panics.eq_any(vec![])
will return no rows.ne_any(vec![])
will return all rows.
0.8.2 - 2016-11-22
-
Fixed support for nightlies later than 2016-11-07
-
Removed support for nightlies earlier than 2016-11-07
-
Calls to
infer_table_from_schema!
will need to be wrapped in a module if called more than once. This change is to work around further limitations of the Macros 1.1 system. Example:mod infer_users { infer_table_from_schema!("dotenv:DATABASE_URL", "users"); } pub use self::infer_users::*;
0.8.1 - 2016-11-01
- SQLite date and time columns can be deserialized to/from strings.
- Fixed an issue with
diesel_codegen
on nightlies >= 2016-10-20
0.8.0 - 2016-10-10
-
Added partial support for composite primary keys.
-
Added support for PostgreSQL
NULLS FIRST
andNULLS LAST
when sorting. See https://docs.diesel.rs/diesel/prelude/trait.SortExpressionMethods.html for details. -
Added support for the
timestamp with time zone
type in PostgreSQL (referred to asdiesel::types::Timestamptz
) -
Diesel CLI can now generate bash completion. See the readme for details.
-
infer_schema!
andinfer_table_from_schema!
can now take"env:foo"
instead ofenv!("foo")
and"dotenv:foo"
instead ofdotenv!("foo")
. The use ofdotenv
requires thedotenv
feature ondiesel_codegen
, which is included by default. Usingenv!
anddotenv!
will no longer work withdiesel_codegen
. They continue to work withdiesel_codegen_syntex
, but that crate will be deprecated when Macros 1.1 is in the beta channel for Rust.
-
Structs annotated with
#[has_many]
or#[belongs_to]
now require#[derive(Associations)]
. This is to allow them to work with Macros 1.1. -
embed_migrations!
now resolves paths relative toCargo.toml
instead of the file the macro was called from. This change is required to allow this macro to work with Macros 1.1.
diesel migrations run
will now respect migration directories overridden by command line argument or environment variable- The
infer_schema!
macro will no longer fetch views alongside with tables. This was a source of trouble for people that had created views or are using any extension that automatically creates views (e.g. PostGIS)
#[changeset_for(foo)]
should now be written as#[derive(AsChangeset)] #[table_name="foo"]
. If you were specifyingtreat_none_as_null = "true"
, you should additionally have#[changeset_options(treat_none_as_null = "true")]
.#[insertable_into(foo)]
should now be written as#[derive(Insertable)] #[table_name="foo"]
.
0.7.2 - 2016-08-20
- Updated nightly version and syntex support.
0.7.1 - 2016-08-11
- The
Copy
constraint has been removed fromIdentifiable::Id
, andIdentifiable#id
now returns&Identifiable::Id
.
#[belongs_to]
now respects theforeign_key
option when usingdiesel_codegen
ordiesel_codegen_syntex
.
0.7.0 - 2016-08-01
-
The initial APIs have been added in the form of
#[has_many]
and#[belongs_to]
. See the module documentation for more information. -
The
Insertable!
macro can now be used instead of#[insertable_into]
for those wishing to avoid syntax extensions fromdiesel_codegen
. See https://docs.diesel.rs/diesel/macro.Insertable!.html for details. -
The
Queryable!
macro can now be used instead of#[derive(Queryable)]
for those wishing to avoid syntax extensions fromdiesel_codegen
. See https://docs.diesel.rs/diesel/macro.Queryable!.html for details. -
The
Identifiable!
macro can now be used instead of#[derive(Identifiable)]
for those wishing to avoid syntax extensions fromdiesel_codegen
. See https://docs.diesel.rs/diesel/macro.Identifiable!.html for details. -
The
AsChangeset!
macro can now be used instead of#[changeset_for(table)]
for those wishing to avoid syntax extensions fromdiesel_codegen
. See https://docs.diesel.rs/diesel/macro.AsChangeset!.html for details. -
Added support for the PostgreSQL
ALL
operator. See https://docs.diesel.rs/diesel/pg/expression/dsl/fn.all.html for details. -
Added support for
RETURNING
expressions inDELETE
statements. Implicitly these queries will useRETURNING *
.
-
Diesel now targets
nightly-2016-07-07
. Future releases will update to a newer nightly version on the date that Rust releases. -
diesel_codegen
has been split into two crates.diesel_codegen
anddiesel_codegen_syntex
. See this commit for migration information. -
Most structs that implement
Queryable
will now also need#[derive(Identifiable)]
. -
infer_schema!
on SQLite now accepts a larger range of type names -
types::VarChar
is now an alias fortypes::Text
. Most code should be unaffected by this. PG array columns are treated slightly differently, however. If you are usingvarchar[]
, you should switch totext[]
instead. -
Struct fields annotated with
#[column_name="name"]
should be changed to#[column_name(name)]
. -
The structure of
DatabaseError
has changed to hold more information. See https://docs.diesel.rs/diesel/result/enum.Error.html and https://docs.diesel.rs/diesel/result/trait.DatabaseErrorInformation.html for more information -
Structs which implement
Identifiable
can now be passed toupdate
anddelete
. This means you can now writedelete(&user).execute(&connection)
instead ofdelete(users.find(user.id)).execute(&connection)
&&[T]
can now be used in queries. This allows using slices with things like#[insertable_into]
.
0.6.1 2016-04-14
- Added the
escape
method toLike
andNotLike
, to specify the escape character used in the pattern. See EscapeExpressionMethods for details.
-
diesel_codegen
anddiesel_cli
now properly rely on Diesel 0.6.0. The restriction to 0.5.0 was an oversight. -
infer_schema!
now properly excludes metadata tables on SQLite. -
infer_schema!
now properly maps types on SQLite.
0.6.0 2016-04-12
-
Queries can now be boxed using the
into_boxed()
method. This is useful for conditionally modifying queries without changing the type. See BoxedDsl for more details. -
infer_schema!
is now supported for use with SQLite3. -
The maximum table size can be increased to 52 by enabling the
huge-tables
feature. This feature will substantially increase compile times. -
The
DISTINCT
keyword can now be added to queries via thedistinct()
method. -
SqliteConnection
now implementsSend
-
diesel::result::Error
now implementsSend
andSync
. This required a change in the return type ofToSql
andFromSql
to have those bounds as well. -
It is no longer possible to pass an owned value to
diesel::insert
.insert
will now give a more helpful error message when you accidentally try to pass an owned value instead of a reference.
-
#[insertable_into]
can now be used with structs that have lifetimes with names other than'a'
. -
Tables with a single column now properly return a single element tuple. E.g. if the column was of type integer, then
users::all_columns
is now(id,)
and notid
. -
infer_schema!
can now work with tables that have a primary key other thanid
.
- Removed the
no select
option for thetable!
macro. This was a niche feature that didn't fit with Diesel's philosophies. You can write a function that callsselect
for you if you need this functionality.
0.5.4 2016-03-23
- Updated
diesel_codegen
to allow syntex versions up to 0.30.0.
0.5.3 2016-03-12
-
Added helper function
diesel_manage_updated_at('TABLE_NAME')
to postgres upon database setup. This function sets up a trigger on the specified table that automatically updates theupdated_at
column to thecurrent_timestamp
for each affected row inUPDATE
statements. -
Added support for explicit
RETURNING
expressions inINSERT
andUPDATE
queries. Implicitly these queries will still useRETURNING *
.
- Updated to work on nightly from early March
0.5.2 2016-02-27
- Updated to work on nightly from late February
0.5.1 2016-02-11
- Diesel CLI no longer has a hard dependency on SQLite and PostgreSQL. It
assumes both by default, but if you need to install on a system that doesn't
have one or the other, you can install it with
cargo install diesel_cli --no-default-features --features postgres
orcargo install diesel_cli --no-default-features --features sqlite
0.5.0 2016-02-05
-
Added support for SQLite. Diesel still uses postgres by default. To use SQLite instead, add
default-features = false, features = ["sqlite"]
to your Cargo.toml. You'll also want to adddefault-features = false, features = ["sqlite"]
todiesel_codegen
. Since SQLite is a much more limited database, it does not support our full set of features. You can use SQLite and PostgreSQL in the same project if you desire. -
Added support for mapping
types::Timestamp
,types::Date
, andtypes::Time
to/fromchrono::NaiveDateTime
,chrono::NaiveDate
, andchrono::NaiveTime
. Addfeatures = ["chrono"]
to enable. -
Added a
treat_none_as_null
option tochangeset_for
. When set totrue
, a model will set a field toNull
when an optional struct field isNone
, instead of skipping the field entirely. The default value of the option isfalse
, as we think the current behavior is a much more common use case. -
Added
Expression#nullable()
, to allow comparisons of not null columns with nullable ones when required. -
Added
sum
andavg
functions. -
Added the
diesel setup
,diesel database setup
, anddiesel database reset
commands to the CLI. -
Added support for SQL
IN
statements through theeq_any
method. -
Added a top level
select
function for select statements with no from clause. This is primarily intended to be used for testing Diesel itself, but it has been added to the public API as it will likely be useful for third party crates in the future.select(foo).from(bar)
might be a supported API in the future as an alternative tobar.select(foo)
. -
Added
expression::dsl::sql
as a helper function for constructingSqlLiteral
nodes. This is primarily intended to be used for testing Diesel itself, but is part of the public API as an escape hatch if our query builder DSL proves inadequate for a specific case. Use of this function in any production code is discouraged as it is inherently unsafe and avoids real type checking.
-
Moved most of our top level trait exports into a prelude module, and re-exported our CRUD functions from the top level.
diesel::query_builder::update
and friends are nowdiesel::update
, and you will get them by default if you importdiesel::*
. For a less aggressive glob, you can importdiesel::prelude::*
, which will only export our traits. -
Connection
is now a trait instead of a struct. The struct that was previously known asConnection
can be found atdiesel::pg::PgConnection
. -
Rename both the
#[derive(Queriable)]
attribute and theQueriable
trait to use the correct spellingQueryable
. -
load
andget_results
now return aVec<Model>
instead of an iterator. -
Replaced
Connection#find(source, id)
withsource.find(id).first(&connection)
. -
The
debug_sql!
macro now uses ` for identifier quoting, and?
for bind parameters, which is closer to a "generic" backend. The previous behavior had no identifier quoting, and used PG specific bind params. -
Many user facing types are now generic over the backend. This includes, but is not limited to
Queryable
andChangeset
. This change should not have much impact, as most impls will have been generated by diesel_codegen, and that API has not changed. -
The mostly internal
NativeSqlType
has been removed. It now requires a known backend.fn<T> foo() where T: NativeSqlType
is nowfn<T, DB> foo() where DB: HasSqlType<T>
Connection#query_sql
andConnection#query_sql_params
have been removed. These methods were not part of the public API, and were only meant to be used for testing Diesel itself. However, they were technically callable from any crate, so the removal has been noted here. Their usage can be replaced with bareselect
andexpression::dsl::sql
.
0.4.1 2016-01-11
-
Diesel CLI will no longer output notices about
__diesel_schema_migrations
already existing. -
Relicensed under MIT/Apache dual
0.4.0 2016-01-08
-
Added Diesel CLI, a tool for managing your schema. See the readme for more information.
-
Add the ability for diesel to maintain your schema for you automatically. See the migrations module for individual methods.
-
Add DebugQueryBuilder to build sql without requiring a connection.
-
Add print_sql! and debug_sql! macros to print out and return sql strings from QueryFragments.
-
#[changeset_for]
can now be used with structs containing aVec
. Fixes #63. -
No longer generate invalid SQL when an optional update field is not the first field on a changeset. Fixes #68.
-
#[changeset_for]
can now be used with structs containing only a single field other thanid
. Fixes #66. -
infer_schema!
properly works with array columns. Fixes #65.
0.3.0 2015-12-04
-
#[changeset_for(table)]
now treatsOption
fields as an optional update. Previously a field withNone
for the value would insertNULL
into the database field. It now does not update the field if the value isNone
. -
.save_changes
(generated by#[changeset_for]
) now returns a new struct, rather than mutatingself
. The returned struct can be any type that implementsQueryable
for the right SQL type
-
#[derive(Queryable)]
now allows generic parameters on the struct. -
Table definitions can now support up to 26 columns. Because this increases our compile time by 3x,
features = ["large-tables"]
is needed to support table definitions above 16 columns.
-
Quickcheck is now an optional dependency. When
features = ["quickcheck"]
is added toCargo.toml
, you'll gainArbitrary
implementations for everything indiesel::data_types
. -
Added support for the SQL
MIN
function. -
Added support for the
Numeric
data type. Since there is no Big Decimal type in the standard library, a dumb struct has been provided which mirrors what Postgres provides, which can be converted into whatever crate you are using. -
Timestamp columns can now be used with
std::time::SystemTime
when compiled with--features unstable
-
Implemented
Send
onConnection
(required for R2D2 support) -
Added
infer_schema!
andinfer_table_from_schema!
. Both macros take a database URL, and will invoketable!
for you automatically based on the schema.infer_schema!
queries for the table names, whileinfer_table_from_schema!
takes a table name as the second argument.
0.2.0 - 2015-11-30
-
Added an
execute
method toQueryFragment
, which is intended to replaceConnection#execute_returning_count
. The old method still exists for use under the hood, but has been hidden from docs and is not considered public API. -
Added
get_result
andget_results
, which work similarly toload
andfirst
, but are intended to make code read better when working with commands likecreate
andupdate
. In the future,get_result
may also check that only a single row was affected. -
Added
insert
, which mirrors the pattern ofupdate
anddelete
.
-
Added a hidden
__Nonexhaustive
variant toresult::Error
. This is not intended to be something you can exhaustively match on, but I do want people to be able to check for specific cases, soBox<std::error::Error>
is not an option. -
query_one
,find
, andfirst
now assume a single row is returned. For cases where you actually expect 0 or 1 rows to be returned, theoptional
method has been added to the result, in case having aResult<Option<T>>
is more idiomatic than checking forErr(NotFound)
.
Connection#insert
andConnection#insert_returning_count
have been deprecated in favor ofinsert
- Initial release