drift 2.21.0 drift: ^2.21.0 copied to clipboard
Drift is a reactive library to store relational data in Dart and Flutter applications.
2.21.0 #
- To infer whether serialization is required for inter-isolate communication, drift now sends a test message instead serializing by default.
- The manager API now ignores references whose target column is a foreign key itself.
- The DevTools extension can now clear drift databases.
View.from
is now declared to return aJoinedSelectStatement
, the type it returns at runtime.
2.20.2 #
- Fix upcoming
unreachable_switch_default
lint.
2.20.1 #
- Migrate legacy
package:drift/web.dart
to the new JS interop SDK libraries. For backwards compatibility, thechannel()
extension on theMessagePort
class indart:html
has been kept. Oncedart:html
is removed from the Dart SDK, that extension will have to be removed from drift as well. - Fix cast errors in the protocol for remote workers when compiling with
dart2wasm
. - Introduce a faster protocol for communicating with workers. This protocol is
enabled automatically after upgrading
drift_worker.js
.
2.20.0 #
- Improve manager API to be able to resolve references when running queries.
- Add
readPool
parameter toNativeDatabase
. It will spawn an additional pool of isolates used to serve multiple reads in parallel, which can improve performance in some specific workloads. - Add
TableIndex.sql
, allowing database indexes to be defined in SQL without using drift files. - Add
DataClassName.implementing
, which can be used to make drift-generated row classes implement existing interfaces. - Mark legacy
package:drift/web.dart
as deprecated. Users should migrate topackage:drift/wasm.dart
.
2.19.2 #
- Support version
1.x
ofpackage:web
.
2.19.1+1 #
- Fix
exclusively
breaking the database connection on the web. Please note that this requires an updateddrift_worker.js
to fix.
2.19.0 #
- Add
exclusively
method to database classes, allowing a block to temporarily take exclusive control over a database connection without starting a transaction. - Add the
enableMigrations
parameter toWasmDatabase
to control whether drift migrations are enabled on that database. - Add
initiallyDeferred
option toreferences()
column builder for foreign key constraints. - Add
dropColumn
method toMigrator
. - Add
selectExpressions
method to build select statements without aFROM
clause. - Fix encoding
BigInt
arguments in batched statements sent to web workers. Note that the fix also requires the latestdrift_worker.js
to be effective. - Both
transaction
andexclusively
will wait for the transaction or the exclusive lock to be set up before invoking their callback now. - Fix stream queries possibly cancelling a migration if they are the first method on the database.
2.18.0 #
- Adds a new interface for writing most simple statements without manually creating
select statements and expressions.
For a detailed description, see the documentation website.
This feature requires additional code to be generated - if you prefer using the existing APIs
exclusively, you can use the
generate_manager: false
builder option - Add
AggregateFunctionExpression
to write custom aggregate function invocations in the Dart query builder. - The
json_group_array
andjsonb_group_array
functions now contain anorderBy
andfilter
parameter.
2.17.0 #
- Adds
companion
entry toDataClassName
to override the name of the generated companion class. - Add the
TypeConverter.extensionType
factory to create type converters for extension types. - Fix invalid SQL syntax being generated for
BLOB
literals on postgres.
2.16.0 #
- When a migration throws, the database will now block subsequent operations instead of potentially allowing them to operate on a database in an inconsistent state.
- Statements built through the Dart query builder will now run in the context
active while they are running, instead of the context active at the time they
were created. For instance, creating an
UpdateStatement
withdatabase.update
outside of a transaction and then callingUpdateStatement.write
inside of a transaction will now perform the update inside of the transaction, instead of causing a deadlock. - Improve stack traces for errors happening on drift isolates (which includes
usages of
NativeDatabase.createInBackground
). - Don't cache
EXPLAIN
statements, avoiding schema locks. - Deprecate
Value.ofNullable
in favor ofValue.absentIfNull
, which is more explicit about its behavior and allows nullable types too. - Migrate
WasmDatabase
todart:js_interop
andpackage:web
.
2.15.0 #
- Methods in the query builder API now respect custom types.
- Support
DialectAwareSqlType
, custom types that depend on the dialect of the active database connection. This can be used to use native types not supported by drift (like UUIDs) on databases that support it while falling back to a text type on sqlite3. - Close wasm databases hosted in workers after the last client disconnects.
- Add
enableMigrations
parameter toNativeDatabase
which can be used to optionally disable database migrations when opening databases. - Support
jsonb
functions in the Dart query builder.
2.14.1 #
- Fix
WasmProbeResult.open
ignoring theìnitializeDatabase
callback.
2.14.0 #
- Add the
QueryInterceptor
API to easily monitor or transform all database calls made by drift. - Add the
count()
extension on tables to easily count rows in tables or views.
2.13.2 #
- Fix a race condition causing query streams to not emit new data around some transaction setups.
2.13.1 #
- Fix a bug when running batches over serialized communication channels.
2.13.0 #
- Add APIs to setup Wasm databases with custom drift workers.
- Add support for custom types, which are useful when extending drift to support other database engines.
- Drift now provides a DevTools extension embedding the drift inspector written by Koen Van Looveren.
- Add
Expression.and
andExpression.or
to create disjunctions and conjunctions of sub-predicates. - Step-by-step migrations now save the intermediate schema version after each step.
2.12.1 #
- Fix
readWithConverter
throwing an exception for null values in non- nullable columns.
2.12.0 #
- Add support for table-valued functions in the Dart query builder.
- Add the
@TableIndex
annotation for table classes to add an index to the table. - Support
json_each
andjson_tree
. - Add the
TypeConverter.json
method to define type converters storing JSON values more easily. - Add
TypedResult.readWithConverter
to read a column with a type converter from a join result row.
2.11.1 #
- Allow using
.read()
for a column added to a join from the table, fixing a regression in drift 2.11.0. - Make step-by-step migrations easier to customize with
Migrator.runMigrationSteps
.
2.11.0 #
- Add support for subqueries in the Dart query builder.
- Add
isInExp
andisNotInExp
to constructIS IN
expressions with arbitrary expressions. - Add the
substr
extension onExpression<String>
to call the sqlite3 function from the Dart API. - Add
isolateSetup
toNativeDatabase.createInBackground()
to override native libraries or perform other database-unrelated setup work. - Add
WasmDatabase.probe()
, a method probing for available implementations and existing databases on the web without opening one directly.
2.10.0 #
- Adds the
schema steps
command todrift_dev
. It generates an API making it easier to write safe schema migrations (docs). - Fix drift WASM not being unusable after a previous database implementation becomes unavailable in the browser.
2.9.0 #
- Forbid
schemaVersion
returning0
, as this causes issues in the migrator. - Drift web support is now stable! By using a
WasmDatabase.open
factory as described in https://drift.simonbinder.eu/web/, you can run a drift database in modern browsers!
2.8.2 #
- Fix prepared statements leaking when the statement cache is disabled.
- Disable prepared statement caching by default.
2.8.1 #
- Performance improvement: Cache and re-use prepared statements - thanks to @davidmartos96
- Fix a deadlock after rolling back a transaction in a remote isolate.
- Remove unintended log messages when using
connectToDriftWorker
.
2.8.0 #
- Don't keep databases in an unusable state if the
setup
callback throws an exception. Instead, drift will retry the next time the database is used. - Allow targeting partial indices in
DoUpdate
(#2394) - Fix deadlocks when
computeWithDatabase
is called inside atransaction()
.
2.7.0 #
- Add support for
CASE
expressions without a base in the Dart API with theCaseWhenExpression
class. - Add the new
package:drift/web/workers.dart
library which makes it easier to create web workers for drift.
2.6.0 #
- Add
insertReturningOrNull
for potentially empty inserts. - Add
insertFromSelect
toInsertStatement
to runINSERT INTO SELECT
statements. - Add
rowid
parameter to companions for tables with rowids that don't have a visible alias for the rowid. - After opening a database with a higher schema version than the current one set in the database class, the schema version in the database will now be downgraded.
- When using a drift isolate in the same engine group, errors on the remote end are
reported directly instead of wrapping them in a
DriftRemoteException
. - Added support for
DO NOTHING
during upsert operations with constraint violations
2.5.0 #
- Add
isExp
,isValue
,isNotExp
andisNotValue
methods toExpression
to generate theIS
operator in SQL. - Add
all()
extension on tables and views to quickly query all rows. - Add
serializableConnection()
andcomputeWithDatabase()
as extensions on databases. The methods allow sharing any drift database between isolates, regardless of how the database has been set up. - The
DatabaseConnection
class now implementsQueryExecutor
, meaning that you no longer need a special.connect()
constructor to use it.
2.4.2 #
- Fix an exception when a client disconnects from a drift remote server while processing a pending table update.
2.4.1 #
- Fix
DriftIsolate
leaking resources for closed connections.
2.4.0 #
- Add
textEnum
column builder andEnumNameConverter
to be able to store enum values as string. - Add
updates
parameter toBatch.customStatement
- it can be used to specify which tables are affected by the custom statement. - For
STRICT
tables in drift files declaring aANY
column, drift will now generate a mapping to the newDriftAny
type. - Add
likeExp
to generateLIKE
expression with any comparison expression. - Fix
UNIQUE
keys declared in drift files being written twice. - Fix
customConstraints
not appearing in dumped database schema files. - Lazily load columns in
TypedResult.read
, increasing performance for joins with lots of tables or columns. - Work-around an issue causing complex migrations via
Migrator.alterTable
not to work if a view referenced the altered table.
2.3.0 #
- Add the
JsonTypeConverter2
mixin. It behaves similar to the existing json type converters, but can use a different SQL and JSON type. - Add
isInValues
andisNotInValues
methods to columns with type converters. They can be used to compare the column against a list of Dart expressions that will be mapped through a type converter. - Add
TableStatements.insertAll
to atomically insert multiple rows. - Add
singleClientMode
toremote()
andDriftIsolate
connections to make the common case with one client more efficient. - Fix a concurrency issue around transactions.
- Add
NativeDatabase.createInBackground
as a drop-in replacement forNativeDatabase
. It creates a drift isolate behind the scenes, avoiding all of the boilerplate usually involved with drift isolates. - Experimental: Add a modular generation mode in which drift will generate multiple smaller files instead of one very large one with all tables and generated queries.
2.2.0 #
- Always escape column names, avoiding the costs of using a regular expression to check whether they need to be escaped.
- Add extensions for binary methods on integer expressions:
operator ~
,bitwiseAnd
andbitwiseOr
.
2.1.0 #
- Improve stack traces when using
watchSingle()
with a stream emitting a non- singleton list at some point. - Add
OrderingTerm.nulls
to control theNULLS FIRST
orNULLS LAST
clause in Dart.
2.0.2+1 #
- Revert the breaking change around
QueryRow.read
only returning non-nullable values now - it was causing issues with type inference in some cases.
2.0.1 #
- Fix an error when inserting a null value into a nullable column defined with additional checks in Dart.
2.0.0 #
💡: More information on how to migrate is available in the documentation.
- Breaking: Type converters now return the types that they were defined to return (instead of the nullable variant of those types like before). It is an error to use a non-nullable type converter on a column that is nullable in SQL and vice-versa.
- Breaking: Mapping methods on type converters are now called
toSql
andfromSql
. - Breaking: Removed
SqlTypeSystem
and subtypes ofSqlType
:- To describe the type a column has, use the
DriftSqlType
enum - To map a value from Dart to SQL and vice-versa, use an instance of
SqlTypes
, reachable viadatabase.options.types
.
- To describe the type a column has, use the
- Breaking:
Expression
s (includingColumn
s) always have a non-nullable type parameter now. They are implicitly nullable, soTypedResult.read
now returns a nullable value. - Breaking:
QueryRow.read
can only read non-nullable values now. To read nullable values, usereadNullable
. - Breaking: Remove the
includeJoinedTableColumns
parameter onselectOnly()
. The method now behaves as if that parameter was turned off. To use columns from a joined table, add them withaddColumns
. - Breaking: Remove the
fromData
factory on generated data classes. Use themap
method on tables instead. - Add support for storing date times as (ISO-8601) strings. For details on how to use this, see the documentation.
- Consistently handle transaction errors like a failing
BEGIN
orCOMMIT
across database implementations. - Add
writeReturning
to update statements;deleteReturning
andgoAndReturn
to delete statatements. - Support nested transactions.
- Support custom collations in the query builder API.
- Custom row classes can now be constructed with static methods too. These static factories can also be asynchronous.
1.7.0 #
- Add the
int64()
column builder to store large integers. These integers are still stored as 64-bit ints in the database, but represented as aBigInt
in Dart. This enables better web support for integers larger than 2^52. More details are in the documentation. - Add
filter
anddistinct
support togroupConcat
. - Fix a deadlock with the
sqflite
-based implementation if the first operation in atransaction
is a future backed by a query stream.
1.6.0 #
- Add the
unique()
method to columns and theuniqueKeys
override for tables to define unique constraints in Dart tables. - Add the
check()
method to the Dart column builder to generateCHECK
column constraints. - Also apply type converters for json serialization and deserialization if they
mix in
JsonTypeConverter
. - Add the very experimental
package:drift/wasm.dart
library. It uses WebAssembly to access sqlite3 without any external JavaScript libraries, but requires you to add a WebAssembly module to theweb/
folder. Please note that this specific library is not subject to semantic versioning until it leaves its experimental state. It also isn't suitable for production use at the moment. - Internally use
package:js
to wrap sql.js.
1.5.0 #
- Add
DataClassName.extending
to control the superclass of generated row classes. - Add
setup
parameter to the constructors ofWebDatabase
too. - Don't write variables for expressions in
CREATE VIEW
statements. - Improve stack traces for errors on a remote isolate.
- Add
MultiExecutor.withReadPool
constructor to load-balance between multiple reading executors. This can be used in a multi-isolate approach if some queries are expensive.
1.4.0 #
- Most methods to compose statements are now available as an extension on
tables. As an alternative to
update(todos).replace(newEntry)
, you can now writetodos.replaceOne(newEntry)
. - Deprecate the
from(table)
API introduced in 1.3.0. Having the methods on the table instances turned out to be even easier! - In drift files, you can now use
LIST(SELECT ...)
as a result column to get all results of the inner select as aList
in the result set.
1.3.0 #
- Add the
from(table)
method to generated databases. It can be used to write common queries more concisely. - Make
groupConcat
nullable in the Dart API. - Throw an exception in a
NativeDatabase
when multiple statements are run in a single call. In previous versions, parts of the SQL string would otherwise be ignored. - Close the underlying database when a drift isolate is shut down.
1.2.0 #
- Properly support stream update queries on views.
- Reading blobs from the database is more lenient now.
- Provide a stack trace when
getSingle()
orwatchSingle()
is used on a query emitting more than one row.
1.1.1 #
- Rollback transactions when a commit fails.
- Revert a change from 1.1.0 to stop serializing messages over isolates.
Instead, please set the
serialize
parameter tofalse
on theDriftIsolate
methods.
1.1.0 #
- Add the
references
method toBuildColumn
to reference a column declared in another Dart table. - Add the
generateInsertable
option to@UseRowClass
. When enabled, the generator will emit an extension to use the row class as anInsertable
. Thanks to @westito. - Allow the generator to emit correct SQL code when using arrays with the
new_sql_code_generation
option in specific scenarios. - Add support for strict tables in
.drift
files. - Add the
generatedAs
method to declare generated columns for Dart tables. - Add
OrderingTerm.random
to fetch rows in a random order. - Improved support for pausing query stream subscriptions. Instead of buffering events, query streams will suspend fetching data if all listeners are paused.
- Drift isolates no longer serialize messages into a primitive format. This will reduce the overhead of using isolates with Drift.