PackageTrack
Sign in Get early access

sqlx-macros

Macros for SQLx, the rust SQL toolkit. Not intended to be used directly.

0.9.0 134M downloads/mo #680 most downloaded on crates.io launchbadge/sqlx

What this package is like to depend on

Last release 3 months ago

21 May 2026

Ships fairly regularly

a new release about every 3 months

Nearly every release is documented

notes for 40 of 42 stable releases

5 versions withdrawn

withdrawn after publishing

7 years old

54 releases · first in 2019

2 releases in the last 12 months

see the full history below

Release timeline

54 releases · Nov 2019 to May 2026
2020 2021 2022 2023 2024 2025 2026
Release Pre-release Withdrawn

Releases

latest 54
  1. 0.9.0 21 May 2026
    Release notes
    • refactor: un-track Cargo.lock

    • chore: prepare release 0.9.0

    • chore: update rand, crypto crates

    • chore: update rand, crypto crates (2)

    • chore: revert -Z direct-minimal-versions

    For context: #4173 (comment)

    • chore: fix new clippy warnings

    • fix: compiler errors in tests/sqlite

    • fix: compiler errors in tests/postgres

    • fix: errors in axum-social-with-tests

    • fix: errors in Postgres examples, update examples/x.py

    • fix(sqlite): don't panic if call_with_result didn't set an error message

    • chore: update CHANGELOG for 0.9.0

    • chore: upgrade etcetera to 0.11.0

    • chore: document release PR changes

    • chore: document Executor methods not for general use

    • chore: update copyright

    Open source →
    Release notes

    Important Announcements

    New Github Organization

    Shortly after this release is published, the SQLx repository will be transferred to a new GitHub organization: https://github.com/transact-rs/

    This is because SQLx has not been owned or maintained by LaunchBadge, LLC. for a few years now, and has since been informally transferred to the collective ownership of its principal authors. Moving the repository to a new organization makes this change more clear, and also allows for potentially inviting outside collaborators.

    Cargo.lock Removed from Tracking

    The Cargo.lock has been removed from tracking in Git. CI should now always test with the latest versions of all dependencies by default, alongside our pass that checks with cargo generate-lockfile -Z minimal-versions.

    This should eliminate the need for any PRs that update dependencies to also update Cargo.lock or contend with an endless stream of merge conflicts against it.

    N.B. cargo install --locked sqlx-cli will no longer work. However, cargo install sqlx-cli has always used the latest dependencies by default, ignoring the lockfile, so most users should not be affected. For users requiring reproducible builds, consider maintaining your own lockfile instead; historically, we only ran cargo update sporadically, so relying on SQLx's lockfile offered few guarantees anyway.

    See the manual page for cargo install for details.

    Breaking

    As per our MSRV policy, the supported Rust version for this release cycle is 1.94.0.

    • [#3383]: feat: create sqlx.toml format [[@abonander]]
      • SQLx and sqlx-cli now support per-crate configuration files (sqlx.toml)
      • New functionality includes, but is not limited to:
        • Rename DATABASE_URL for a crate (for multi-database workspaces)
        • Set global type overrides for the macros (supporting custom types)
        • Rename or relocate the _sqlx_migrations table (for multiple crates using the same database)
        • Set characters to ignore when hashing migrations (e.g. ignore whitespace)
      • More to be implemented in future releases.
      • Enable feature sqlx-toml to use.
      • Guide: see sqlx::_config module in documentation.
      • Reference: [Link]
      • Examples (written for Postgres but can be adapted to other databases; PRs welcome!):
        • Multiple databases using DATABASE_URL renaming and global type overrides: [Link]
        • Multi-tenant database using _sqlx_migrations renaming and multiple schemas: [Link]
        • Force use of chrono when time is enabled (e.g. when using tower-sessions-sqlx-store): [Link]
          • Forcing bigdecimal when rust_decimal is enabled is also shown, but problems with chrono/time are more common.
      • Breaking changes:
        • Significant changes to the Migrate trait
        • sqlx::migrate::resolve_blocking() is now #[doc(hidden)] and thus SemVer-exempt.
    • [#3486]: fix(logs): Correct spelling of aquired_after_secs tracing field [[@iamjpotts]]
      • Breaking behavior change: implementations parsing tracing logs from SQLx will need to update the spelling.
    • [#3495]: feat(postgres): remove lifetime from PgAdvisoryLockGuard [[@bonsairobo]]
    • [#3526]: Return &mut Self from the migrator set_ methods [[@nipunn1313]]
      • Minor breaking change: Migrator::set_ignore_missing and set_locking now return &mut Self instead of &Self which may break code in rare circumstances.
    • [#3541]: Postgres: force generic plan for better nullability inference. [[@joeydewaal]]
      • Breaking change: may alter the output of the query!() macros for certain queries in Postgres.
    • [#3613]: fix: RawSql lifetime issues [[@abonander]]
      • Breaking change: adds DB type parameter to all methods of RawSql
    • [#3670]: Bump ipnetwork to v0.21.1 [[@BeauGieskens]]
    • [#3674]: Implement Decode, Encode and Type for Box, Arc, Cow and Rc [[@joeydewaal]]
      • Breaking change: impl Decode for Cow now always decodes Cow::Owned, lifetime is unlinked
      • See this discussion for motivation: https://github.com/launchbadge/sqlx/pull/3674#discussion_r2008611502
    • [#3723]: Add SqlStr [[@joeydewaal]]
      • Breaking change: all query*() functions now take impl SqlSafeStr which is only implemented for &'static str and AssertSqlSafe. For all others, wrap in AssertSqlSafe(<query>).
      • This, along with [#3960], finally allows returning owned queries as the type will be Query<'static, DB>.
      • SqlSafeStr trait is deliberately similar to std::panic::UnwindSafe, serving as a speedbump to warn users about naïvely building queries with format!() while allowing a workaround for advanced usage that is easy to spot on code review.
    • [#3800]: Escape PostgreSQL Options [[@V02460]]
      • Breaking behavior change: options passed to PgConnectOptions::options() are now automatically escaped. Manual escaping of options is no longer necessary and may cause incorrect behavior.
    • [#3821]: Groundwork for 0.9.0-alpha.1 [[@abonander]]
      • Increased MSRV to 1.86 and set rust-version
      • Deleted deprecated combination runtime+TLS features (e.g. runtime-tokio-native-tls)
      • Deleted re-export of unstable TransactionManager trait in sqlx.
        • Not technically a breaking change because it's #[doc(hidden)], but it will break SeaORM if not proactively fixed.
    • [#3924]: breaking(mysql): assume all non-binary collations compatible with str [[@abonander]]
      • Text (or text-like) columns which previously were inferred to be Vec<u8> will be inferred to be String (this should ultimately fix more code than it breaks).
      • SET NAMES utf8mb4 COLLATE utf8_general_ci is no longer sent by default; instead, SET NAMES utf8mb4 is sent to allow the server to select the appropriate default collation (since this is version- and configuration-dependent).
      • MySqlConnectOptions::charset() and ::collation() now imply ::set_names(true) because they don't do anything otherwise.
      • Setting charset doesn't change what's sent in the Protocol::HandshakeResponse41 packet as that normally only matters for error messages before SET NAMES is sent. The default collation if set_names = false is utf8mb4_general_ci.
      • See this comment for details.
      • Incidental breaking change: RawSql::fetch_optional() now returns sqlx::Result<Option<DB::Row>> instead of sqlx::Result<DB::Row>. Whoops.
    • [#3928]: breaking(sqlite): libsqlite3-sys versioning, feature flags, safety changes [[@abonander]]
      • SemVer policy changes: libsqlite3-sys version is now specified using a range. The maximum of the range may now be increased in any backwards-compatible release. The minimum of the range may only be increased in major releases. If you have libsqlite3-sys in your dependencies, Cargo should choose a compatible version automatically. If otherwise unconstrained, Cargo should choose the latest version supported.
      • SQLite extension loading (including through the new sqlx-toml feature) is now unsafe.
      • Added new non-default features corresponding to conditionally compiled SQLite APIs:
        • sqlite-deserialize enabling SqliteConnection::serialize() and SqliteConnection::deserialize()
        • sqlite-load-extension enabling SqliteConnectOptions::extension() and ::extension_with_entrypoint()
        • sqlite-unlock-notify enables internal use of sqlite3_unlock_notify()
      • SqliteValue and SqliteValueRef changes:
        • The sqlite3_value* interface reserves the right to be stateful. Without protection, any call could theoretically invalidate values previously returned, leading to dangling pointers.
        • SqliteValue is now !Sync and SqliteValueRef is !Send to prevent data races from concurrent accesses.
          • Instead, clone or wrap the SqliteValue in Mutex, or convert the SqliteValueRef to an owned value.
        • SqliteValue and any derived SqliteValueRefs now internally track if that value has been used to decode a borrowed &[u8] or &str and errors if it's used to decode any other type.
        • This is not expected to affect the vast majority of usages, which should only decode a single type per SqliteValue/SqliteValueRef.
        • See new docs on SqliteValue for details.
    • [#3949]: Postgres: move PgLTree::from to From<Vec<PgLTreeLabel>> implementation [[@JerryQ17]]
    • [#3957]: refactor(sqlite): do not borrow bound values, delete lifetime on SqliteArguments [[@iamjpotts]]
    • [#3958]: refactor(any): Remove lifetime parameter from AnyArguments [[@iamjpotts]]
    • [#3960]: refactor(core): Remove lifetime parameter from Arguments trait [[@iamjpotts]]
    • [#3993]: Unescape PostgreSQL passfile password [[@V02460]]
      • Previously, .pgpass file handling did not process backslash-escapes in the password part. Now it does, which may change what password is sent to the server.
    • [#4008]: make #[derive(sqlx::Type)] automatically generate impl PgHasArrayType by default for newtype structs [[@papaj-na-wrotkach]]
      • Manual implementations of PgHasArrayType for newtypes will conflict with the generated one. Delete the manual impl or add #[sqlx(no_pg_array)] where conflicts occur.
    • [#4077]: breaking: make offline optional to allow building without serde [[@CathalMullan]]
    • [#4094]: Bump bit-vec to v0.8 [[@zennozenith]]
    • [#4142]: feat(mysql): add mysql-rsa feature for non-TLS RSA auth [[@dertin]]
      • Connections requiring RSA password encryption now need to enable the mysql-rsa feature or an error will be generated at runtime. RSA encryption is only used for plaintext (non-TLS) connections.
    • [#4255]: breaking(any+mysql): correctly convert text and blob types to AnyTypeInfo [[@abonander]]

    Added

    • [#3641]: feat(Postgres): support nested domain types [[@joeydewaal]]
    • [#3651]: Add PgBindIter for encoding and use it as the implementation encoding &[T] [[@tylerhawkes]]
    • [#3675]: feat: implement Encode, Decode, Type for Arc<str> and Arc<[u8]> (and Rc equivalents) [[@joeydewaal]]
    • [#3791]: Smol+async global executor 1.80 dev [[@martin-kolarik]]
      • Adds runtime-smol and runtime-async-global-executor features to replace usages of the deprecated async-std crate.
    • [#3859]: Add more JsonRawValue encode/decode impls. [[@Dirbaio]]
    • [#3881]: CLi: made cli-lib modules publicly available for other crates [[@silvestrpredko]]
    • [#3889]: Compile-time support for external drivers [[@bobozaur]]
    • [#3917]: feat(sqlx.toml): support SQLite extensions in macros and sqlx-cli [[@djarb]]
    • [#3918]: Feature: Add exclusion violation error kind [[@barskern]]
    • [#3971]: Allow single-field named structs to be transparent [[@Xiretza]]
    • [#4015]: feat(sqlite): no_tx migration support [[@AlexTMjugador]]
    • [#4020]: Add Migrator::with_migrations() constructor [[@xb284524239]]
    • [#3846]: Add the possibility to skip migrations [[@Dosenpfand]]
    • [#4107]: Add SQLite extension entrypoint config to sqlx.toml, update SQLite extension example [[@supleed2]]
    • [#4118]: [postgres] Display line number in error message [[@mousetail]]
    • [#4123]: feat: add Json::into_inner() [[@chrxn1c]]
    • [#4153]: Add on unimplemented diagnostic to SqlStr [[@joeydewaal]]
    • [#4167]: add sqlite serialize/deserialize example [[@mattrighetti]]
    • [#4228]: sqlx-postgres: Make PgNotification struct clone [[@michaelvanstraten]]

    Changed

    • [#3525]: Remove unnecessary boxfutures [[@joeydewaal]]
    • [#3867]: sqlx-postgres: Bump etcetera to 0.10.0 [[@miniduikboot]]
    • [#3709]: chore: replace once_cell OnceCell/Lazy with std OnceLock/LazyLock [[@paolobarbolini]]
    • [#3890]: feat: Unify Debug implementations across PgRow, MySqlRow and SqliteRow [[@davidcornu]]
    • [#3911]: chore: upgrade async-io to v2.4.1 [[@zebrapurring]]
    • [#3938]: Move QueryLogger back [[@joeydewaal]]
    • [#3956]: chore(sqlite): Remove unused test of removed git2 feature [[@iamjpotts]]
    • [#3962]: Give SQLX_OFFLINE_DIR from environment precedence in macros [[@psionic-k]]
    • [#3968]: chore(ci): Add timeouts to ci jobs [[@iamjpotts]]
    • [#4002]: sqlx-postgres(tests): cleanup 2 unit tests. [[@joeydewaal]]
    • [#4022]: refactor: tweaks after #3791 [[@abonander]]
    • [#4257]: Prefer to give real data to .bind() in README.md [[@sobolevn]]
    • [#4042]: Update to webpki-roots 1 [[@tottoto]]
    • [#4072]: chore: update hashlink to v0.11.0 [[@anmolitor]]
    • [#4143]: Bump whoami to v2 [[@tisonkun]]
    • [#4161]: sqlx-sqlite: relax libsqlite3-sys constraint to allow 0.36.x [[@darioAnongba]]
    • [#4173]: ci: check direct minimal versions [[@ricochet]]
      • Note: reverted in 0.9.0 release but still listed for contributor credit. See end of PR thread for details.
    • [#4189]: Bump flume to 0.12.0 [[@opoplawski]]
    • [#4223]: test(sqlite): add regression test for ORDER BY + LIMIT nullability (#4147) [[@barry3406]]
    • [#4230]: chore: Update to cargo_metadata 0.23 [[@tottoto]]
    • [#4233]: Change reference to dotenvy [[@graemer957]]
    • [#4235]: chore: Update to validator 0.20 [[@tottoto]]
    • [#4253]: chore: update example to axum 0.8 [[@tottoto]]
    • Release PR:
      • Upgraded all Rust-Crypto crates, rand
      • Upgraded etcetera to 0.11.0
      • Increased max of libsqlite3-sys version range to <0.38.0

    Fixed

    • [#3840]: Fix docs.rs build of sqlx-sqlite [[@gferon]]
    • [#3848]: fix(macros): don't mutate environment variables [[@joeydewaal]]
    • [#3856]: fix(macros): slightly improve unsupported type error message [[@dyc3]]
    • [#3857]: fix(mysql): validate parameter count for prepared statements [[@cvzx]]
    • [#3861]: Fix NoHostnameTlsVerifier for rustls 0.23.24 and above [[@elichai]]
    • [#3863]: Use unnamed statement in pg when not persistent [[@ThomWright]]
    • [#3874]: Further reduce dependency on futures and futures-util [[@paolobarbolini]]
    • [#3886]: fix: use Executor::fetch in QueryAs::fetch [[@bobozaur]]
    • [#3910]: feat(ok): add correct handling of ok packets in MYSQL implementation [[@0xfourzerofour]]
    • [#3914]: fix: regenerate test certificates [[@abonander]]
    • [#3915]: fix: spec_error is used by try_from derive [[@saiintbrisson]]
    • [#3919]: fix[sqlx-postgres]: do a checked_mul to prevent panic'ing [[@nhatcher-frequenz]]
    • [#3923]: sqlx-mysql: Fix bug in cleanup test db's. [[@joeydewaal]]
    • [#3950]: chore: Fix warnings for custom postgres_## cfg flags [[@iamjpotts]]
    • [#3952]: Pool.close: close all connections before returning [[@jpmelos]]
    • [#3975]: fix documentation for rustls native root certificates [[@2ndDerivative]]
    • [#3977]: refactor(ci): Use separate job for postgres ssl auth tests [[@iamjpotts]]
    • [#3980]: Correctly ROLLBACK transaction when dropped during BEGIN. [[@kevincox]]
    • [#3981]: SQLite: fix transaction level accounting with bad custom command. [[@kevincox]]
    • [#3986]: chore(core): Fix docstring for Query::try_bind [[@iamjpotts]]
    • [#3987]: chore(deps): Resolve deprecation warning for chrono Date and ymd methods [[@iamjpotts]]
    • [#3988]: refactor(sqlite): Resolve duplicate test target warning for macros.rs [[@iamjpotts]]
    • [#3989]: chore(deps): Set default-features=false on sqlx in workspace.dependencies [[@iamjpotts]]
    • [#3991]: fix(sqlite): regression when decoding nulls [[@abonander]]
    • [#4006]: PostgreSQL SASL – run SHA256 in a blocking executor [[@ThomWright]]
    • [#4007]: fix(compose): use OS-assigned ports for all conatiners [[@papaj-na-wrotkach]]
    • [#4009]: Drop cached db connections in macros upon hitting an error [[@swlynch99]]
    • [#4024]: fix(sqlite) Migrate revert with no-transaction [[@Dosenpfand]]
    • [#4027]: native tls handshake: build TlsConnector in blocking threadpool [[@daviduebler]]
    • [#4053]: fix(macros): smarter .env loading, caching, and invalidation [[@abonander]]
      • Additional credit to [[@AlexTMjugador]] ([#4018]) and [[@Diggsey]] ([#4039]) for their proposed solutions which served as a useful comparison.
    • [#4068]: Fix typo in migration example from 'uesrs' to 'users' [[@squidpickles]]
    • [#4069]: fix some spelling issues [[@joeydewaal]]
    • [#4086]: fix(mysql): Work around for Issue #2206 (ColumnNotFound error when querying) [[@duelafn]]
    • [#4088]: (Fix) Handle nullability of SQLite rowid alias columns [[@Lege19]]
    • [#4100]: postgres: update pgpass path on windows [[@joeydewaal]]
    • [#4134]: fix CI: replace removed macOS runner, deprecated use of Command::cargo_bin() [[@abonander]]
    • [#4136]: Ensure Deterministic Migration Order [[@aoengin]]
    • [#4158]: Fix panic in JSONB decoder on invalid version byte [[@jrey8343]]
    • [#4165]: sqlx-postgres: fix correct operator precedence in byte length check [[@cuiweixie]]
    • [#4171]: fix(postgres): remove home crate in favor of std::env::home_dir [[@ricochet]]
    • [#4172]: fix(sqlx-cli): bump openssl minimum to 0.10.46 [[@ricochet]]
    • [#4176]: fix(mysql): return error instead of panic on truncated OK packet [[@cvzx]]
    • [#4199]: fix(postgres): make advisory lock cancel safe [[@joeydewaal]]
    • [#4201]: Fix SCRAM password SASLprep [[@var4yn]]
    • [#4202]: fix: replace from_utf8_unchecked with from_utf8_lossy in SqliteError [[@joaquinhuigomez]]
    • [#4203]: fix: use sqlite3_value_text for REGEXP to match SQLite coercion [[@joaquinhuigomez]]
    • [#4219]: sqlite: lossily coerce invalid UTF-8 in custom collation callback [[@joaquinhuigomez]]
    • [#4221]: fix: replace from_utf8_unchecked with from_utf8 in SQLite column name handling [[@barry3406]]
    • [#4226]: fix(postgres): use non-prepared statements for metadata queries [[@abonander]]
    • [#4227]: fix(macros-core): update unstable proc_macro APIs for recent nightly [[@barry3406]]
    • [#4234]: fix: Use correct path in error when failing to create tmp dir in prepare [[@Miesvanderlippe]]
    • [#4245]: fix(mysql): repair caching_sha2_password fast-auth path [[@altmannmarcelo]]
    • [#4251]: fix(tls): potential deadlock in StdSocket::poll_ready() [[@abonander]]
    Open source →
  2. 0.9.0-alpha.1 15 Oct 2025 pre-release

    Nothing published for this version

  3. 0.8.6 19 May 2025
    Release notes

    0.8.6 release (#3870)

    Open source →
    Release notes

    9 pull requests were merged this release cycle.

    Added

    • [#3849]: Add color and wrapping to cli help text [[@joshka]]

    Changed

    • [#3830]: build: drop unused tempfile dependency [[@paolobarbolini]]
    • [#3845]: chore: clean up no longer used imports [[@tisonkun]]
    • [#3863]: Use unnamed statement in pg when not persistent [[@ThomWright]]
    • [#3866]: chore(doc): clarify compile-time verification and case conversion behavior [[@duhby]]

    Fixed

    • [#3840]: Fix docs.rs build of sqlx-sqlite [[@gferon]]
    • [#3848]: fix(macros): don't mutate environment variables [[@joeydewaal]]
    • [#3855]: fix attrubute typo in doc [[@kujeger]]
    • [#3856]: fix(macros): slightly improve unsupported type error message [[@dyc3]]
    Open source →
  4. 0.8.5 15 Apr 2025
    Release notes
    • fix(cli): correctly handle .env files again

    • feat(ci): add functionality tests for sqlx-cli (MySQL)

    • feat(ci): add functionality tests for sqlx-cli (Postgres)

    • feat(ci): add functionality tests for sqlx-cli (SQLite)

    • chore: prepare 0.8.5 release

    • feat(ci): run test-attr tests twice to catch #3825

    • fix: correct bugs in MySQL implementation of #[sqlx::test]

    Open source →
    Release notes

    Hotfix release to address two new issues:

    The 0.8.4 release will be yanked as of publishing this one.

    Added

    • In release PR: sqlx-cli now accepts --no-dotenv in subcommand arguments.
    • In release PR: added functionality tests for sqlx-cli to CI.
    • In release PR: test #[sqlx::test] twice in CI to cover cleanup.

    Fixed

    • In release PR: sqlx-cli correctly reads .env files by default again.
    • In release PR: fix bugs in MySQL implementation of #[sqlx::test].
    Open source →
  5. 0.8.4 14 Apr 2025 withdrawn
    Release notes

    50 pull requests were merged this release cycle.

    Added

    • [#3603]: Added missing special casing for encoding embedded arrays of custom types [[@nico-incubiq]]
    • [#3625]: feat(sqlite): add preupdate hook [[@aschey]]
    • [#3655]: docs: add example for postgres enums with type TEXT [[@tisonkun]]
    • [#3677]: Add json(nullable) macro attribute [[@seanaye]]
    • [#3687]: Derive clone and debug for postgresql arguments [[@remysaissy]]
    • [#3690]: feat: add postres geometry line segment [[@jayy-lmao]]
    • [#3707]: feat(Sqlite): add LockedSqliteHandle::last_error [[@joeydewaal]]
    • [#3710]: feat: add ipnet support [[@BeauGieskens]]
    • [#3711]: feat(postgres): add geometry box [[@jayy-lmao]]
    • [#3714]: chore: expose bstr feature [[@joeydewaal]]
    • [#3716]: feat(postgres): add geometry path [[@jayy-lmao]]
    • [#3724]: feat(sqlx-cli): Add flag to disable automatic loading of .env files [[@benwilber]]
    • [#3734]: QueryBuilder: add debug_assert when push_values is passed an empty set of tuples [[@chanmaoganda]]
    • [#3745]: feat: sqlx sqlite expose de/serialize [[@mattrighetti]]
    • [#3765]: Merge of #3427 (by @mpyw) and #3614 (by @bonsairobo) [[@abonander]]
      • [#3427] Expose transaction_depth through get_transaction_depth() method [[@mpyw]]
        • Changed to Connection::is_in_transaction in [#3765]
      • [#3614] Add begin_with methods to support database-specific transaction options [[@bonsairobo]]
    • [#3769]: feat(postgres): add geometry polygon [[@jayy-lmao]]
    • [#3773]: feat(postgres): add geometry circle [[@jayy-lmao]]

    Changed

    • [#3665]: build(deps): bump semver compatible dependencies [[@paolobarbolini]]
    • [#3669]: refactor(cli): replace promptly with dialoguer [[@paolobarbolini]]
    • [#3672]: add #[track_caller] to Row::get() [[@karambarakat]]
    • [#3708]: chore(MySql): Remove unnecessary box [[@joeydewaal]]
    • [#3715]: chore: add pg_copy regression tests [[@joeydewaal]]
    • [#3721]: Replace some futures-core / futures-util APIs with std variants [[@paolobarbolini]]
    • [#3725]: chore: replace rustls-pemfile with rustls-pki-types [[@tottoto]]
    • [#3754]: chore(cli): remove unused async-trait crate from dependencies [[@tottoto]]
    • [#3762]: docs(pool): recommend actix-web ThinData over Data to avoid two Arcs [[@jonasmalacofilho]]

    Fixed

    • [#3289]: Always set SQLITE_OPEN_URI on in-memory sqlite [[@LecrisUT]]
    • [#3334]: Fix: nextest cleanup race condition [[@bonega]]
    • [#3666]: fix(cli): running tests on 32bit platforms [[@paolobarbolini]]
    • [#3686]: fix: handle nullable values by printing NULL instead of panicking [[@joeydewaal]]
    • [#3700]: fix(Sqlite): stop sending rows after first error [[@joeydewaal]]
    • [#3701]: fix(postgres) use signed int for length prefix in PgCopyIn [[@joeydewaal]]
    • [#3703]: fix(Postgres) chunk pg_copy data [[@joeydewaal]]
    • [#3712]: FromRow: Fix documentation order [[@Turbo87]]
    • [#3720]: Fix readme: uuid feature is gating for all repos [[@jthacker]]
    • [#3728]: postgres: Fix tracing span when dropping PgListener [[@chitoku-k]]
    • [#3741]: Fix example calculation in docs [[@dns2utf8]]
    • [#3749]: docs: add some missing backticks [[@soulwa]]
    • [#3753]: Avoid privilege requirements by using an advisory lock in test setup (postgres). [[@kildrens]]
    • [#3755]: Fix FromRow docs for tuples [[@xvapx]]
    • [#3768]: chore(Sqlite): remove ci.db from repo [[@joeydewaal]]
    • [#3771]: fix(ci): breakage from Rustup 1.28 [[@abonander]]
    • [#3786]: Fix a copy-paste error on get_username docs [[@sulami]]
    • [#3801]: Fix: Enable Json type when db feature isn't enabled [[@thriller08]]
    • [#3809]: fix: PgConnectOptions docs [[@mbj]]
    • [#3811]: Fix error message typo in PgPoint::from_str [[@TeCHiScy]]
    • [#3812]: mysql: Fix panic on invalid text row length field [[@0xdeafbeef]]
    • [#3815]: fix(macros): cache macro metadata based on CARGO_MANIFEST_DIR [[@joeydewaal]]
    • Fixes in release PR [#3819] [[@abonander]]:
      • fix(postgres): send limit: 0 for all Execute messages
        • Addresses [#3673]: Parallel workers not used on Postgres
      • fix: let CertificateInput::from infer any PEM-encoded document
        • Fixes PGSSLKEY not being parsed correctly when containing a PEM-encoded private key.
      • doc: improve documentation of PgConnectOptions
        • PGHOSTADDR now can be used to override PGHOST.
        • Addresses [#3740]: Document the URL syntax for Unix-domain sockets when connecting to postgres
    Open source →
  6. 0.8.3 04 Jan 2025
    Release notes
    • chore: create 0.8.3 release

    • fix: prevent dead-branch warning from Clippy in query macros

    cc #3595

    • fix: move #[allow] from previous commit to the if block
    Open source →
    Release notes

    41 pull requests were merged this release cycle.

    Added

    • [#3418]: parse timezone parameter in mysql connection url [[@dojiong]]
    • [#3491]: chore: Update async-std v1.13 [[@jayvdb]]
    • [#3492]: expose relation_id and relation_attribution_no on PgColumn [[@kurtbuilds]]
    • [#3493]: doc(sqlite): document behavior for zoned date-time types [[@abonander]]
    • [#3500]: Add sqlite commit and rollback hooks [[@gridbox]]
    • [#3505]: chore(mysql): create test for passwordless auth (#3484) [[@abonander]]
    • [#3507]: Add a "sqlite-unbundled" feature that dynamically links to system libsqlite3.so library [[@lilydjwg]]
    • [#3508]: doc(sqlite): show how to turn options into a pool [[@M3t0r]]
    • [#3514]: Support PgHstore by default in macros [[@joeydewaal]]
    • [#3550]: Implement Acquire for PgListener [[@sandhose]]
    • [#3551]: Support building with rustls but native certificates [[@IlyaBizyaev]]
    • [#3553]: Add support for Postgres lquery arrays [[@philipcristiano]]
    • [#3560]: Add PgListener::next_buffered(), to support batch processing of notifications [[@chanks]]
    • [#3577]: Derive Copy where possible for database-specific types [[@veigaribo]]
    • [#3579]: Reexport AnyTypeInfoKind [[@Norlock]]
    • [#3580]: doc(mysql): document difference between Uuid and uuid::fmt::Hyphenated [[@abonander]]
    • [#3583]: feat: point [[@jayy-lmao]]
    • [#3608]: Implement AnyQueryResult for Sqlite and MySQL [[@pxp9]]
    • [#3623]: feat: add geometry line [[@jayy-lmao]]
    • [#3658]: feat: add Transaction type aliases [[@joeydewaal]]

    Changed

    • [#3519]: Remove unused dependencies from sqlx-core, sqlx-cli and sqlx-postgres [[@vsuryamurthy]]
    • [#3529]: Box Pgconnection fields [[@joeydewaal]]
    • [#3548]: Demote .pgpass file warning to a debug message. [[@denschub]]
    • [#3585]: Eagerly reconnect in PgListener::try_recv [[@swlynch99]]
    • [#3596]: Bump thiserror to v2.0.0 [[@paolobarbolini]]
    • [#3605]: Use UNION ALL instead of UNION in nullable check [[@Suficio]]
    • [#3629]: chore: remove BoxFuture's (non-breaking) [[@joeydewaal]]
    • [#3632]: Bump hashlink to v0.10 [[@paolobarbolini]]
    • [#3643]: Roll PostgreSQL 11..=15 tests to 13..=17 [[@paolobarbolini]]
    • [#3648]: close listener connection on TimedOut and BrokenPipe errors [[@DXist]]
    • [#3649]: Bump hashbrown to v0.15 [[@paolobarbolini]]

    Fixed

    • [#3528]: fix: obey no-transaction flag in down migrations [[@manifest]]
    • [#3536]: fix: using sqlx::test macro inside macro's [[@joeydewaal]]
    • [#3545]: fix: remove sqlformat [[@tbar4]]
    • [#3558]: fix: fix example code of query_as [[@xuehaonan27]]
    • [#3566]: Fix: Cannot query Postgres INTERVAL[] [[@Ddystopia]]
    • [#3593]: fix: URL decode database name when parsing connection url [[@BenoitRanque]]
    • [#3601]: Remove default-features = false from url [[@hsivonen]]
    • [#3604]: Fix mistake in sqlx::test fixtures docs [[@andreweggleston]]
    • [#3612]: fix(mysql): percent-decode database name [[@abonander]]
    • [#3640]: Dont use EXPLAIN in nullability check for QuestDB [[@Suficio]]
    Open source →
  7. 0.8.2 03 Sep 2024
    Release notes

    doc(FAQ): add example for MSRV

    Open source →
    Release notes

    10 pull requests were merged this release cycle.

    This release addresses a few regressions that have occurred, and refines SQLx's MSRV policy (see the FAQ).

    Added

    • [#3447]: Clarify usage of Json/Jsonb in query macros [[@Lachstec]]

    Changed

    • [#3424]: Remove deprecated feature-names from Cargo.toml files in examples [[@carschandler]]

    Fixed

    • [#3403]: Fix (#3395) sqlx::test macro in 0.8 [[@joeydewaal]]
    • [#3411]: fix: Use rfc3339 to decode date from text [[@pierre-wehbe]]
    • [#3453]: fix(#3445): PgHasArrayType [[@joeydewaal]]
      • Fixes #[sqlx(no_pg_array)] being forbidden on #[derive(Type)] structs.
    • [#3454]: fix: non snake case warning [[@joeydewaal]]
    • [#3459]: Pgsql cube type compile fail [[@kdesjard]]
    • [#3465]: fix(postgres): max number of binds is 65535, not 32767 (regression) [[@abonander]]
    • [#3467]: fix cancellation issues with PgListener, PgStream::recv() [[@abonander]]
      • Fixes cryptic unknown message: "\\0" error
    • [#3474]: Fix try_get example in README.md [[@luveti]]
    Open source →
  8. 0.8.1 24 Aug 2024
    Release notes

    chore: prepare release 0.8.1

    Open source →
    Release notes

    16 pull requests were merged this release cycle.

    This release contains a fix for RUSTSEC-2024-0363.

    Postgres users are advised to upgrade ASAP as a possible exploit has been demonstrated: https://github.com/launchbadge/sqlx/issues/3440#issuecomment-2307956901

    MySQL and SQLite do not appear to be exploitable, but upgrading is recommended nonetheless.

    Added

    • [#3421]: correct spelling of MySqlConnectOptions::no_engine_substitution() [[@kolinfluence]]
      • Deprecates MySqlConnectOptions::no_engine_subsitution() (oops) in favor of the correctly spelled version.

    Changed

    • [#3376]: doc: hide spec_error module [[@abonander]]
      • This is a helper module for the macros and was not meant to be exposed.
      • It is not expected to receive any breaking changes for the 0.8.x release, but is not designed as a public API. Use at your own risk.
    • [#3382]: feat: bumped to libsqlite3-sys=0.30.1 to support sqlite 3.46 [[@CommanderStorm]]
    • [#3385]: chore(examples):Migrated the pg-chat example to ratatui [[@CommanderStorm]]
    • [#3399]: Upgrade to rustls 0.23 [[@djc]]
      • RusTLS now has pluggable cryptography providers: ring (the existing implementation), and aws-lc-rs which has optional FIPS certification.
      • The existing features activating RusTLS (runtime-tokio-rustls, runtime-async-std-rustls, tls-rustls) enable the ring provider of RusTLS to match the existing behavior so this should not be a breaking change.
      • Switch to the tls-rustls-aws-lc-rs feature to use the aws-lc-rs provider.
        • If using runtime-tokio-rustls or runtime-async-std-rustls, this will necessitate switching to the appropriate non-legacy runtime feature: runtime-tokio or runtime-async-std
      • See the RusTLS README for more details: https://github.com/rustls/rustls?tab=readme-ov-file#cryptography-providers

    Fixed

    • [#2786]: fix(sqlx-cli): do not clean sqlx during prepare [[@cycraig]]
    • [#3354]: sqlite: fix inconsistent read-after-write [[@ckampfe]]
    • [#3371]: Fix encoding and decoding of MySQL enums in sqlx::Type [[@alu]]
    • [#3374]: fix: usage of node12 in SQLx action [[@hamirmahal]]
    • [#3380]: chore: replace structopt with clap in examples [[@tottoto]]
    • [#3381]: Fix CI after Rust 1.80, remove dead feature references [[@abonander]]
    • [#3384]: chore(tests): fixed deprecation warnings [[@CommanderStorm]]
    • [#3386]: fix(dependencys):bumped cargo_metadata to v0.18.1 to avoid yanked v0.14.3 [[@CommanderStorm]]
    • [#3389]: fix(cli): typo in error for required DB URL [[@ods]]
    • [#3417]: Update version to 0.8 in README [[@soucosmo]]
    • [#3441]: fix: audit protocol handling [[@abonander]]
      • This addresses RUSTSEC-2024-0363 and includes regression tests for MySQL, Postgres and SQLite.
    Open source →
  9. 0.8.0 23 Jul 2024
    Release notes

    chore: bump version to 0.8.0

    Open source →
    Release notes

    70 pull requests were merged this release cycle.

    #2697 was merged the same day as release 0.7.4 and so was missed by the automatic CHANGELOG generation.

    Breaking

    • [#2697]: fix(macros): only enable chrono when time is disabled [[@saiintbrisson]]
    • [#2973]: Generic Associated Types in Database, replacing HasValueRef, HasArguments, HasStatement [[@nitn3lav]]
    • [#2482]: chore: bump syn to 2.0 [[@saiintbrisson]]
      • Deprecated type ascription syntax in the query macros was removed.
    • [#2736]: Fix describe on PostgreSQL views with rules [[@tsing]]
      • Potentially breaking: nullability inference changes for Postgres.
    • [#2869]: Implement PgHasArrayType for all references [[@tylerhawkes]]
      • Conflicts with existing manual implementations.
    • [#2940]: fix: Decode and Encode derives (#1031) [[@benluelo]]
      • Changes lifetime obligations for field types.
    • [#3064]: Sqlite explain graph [[@tyrelr]]
      • Potentially breaking: nullability inference changes for SQLite.
    • [#3123]: Reorder attrs in sqlx::test macro [[@bobozaur]]
      • Potentially breaking: attributes on #[sqlx::test] usages are applied in the correct order now.
    • [#3126]: Make Encode return a result [[@FSMaxB]]
    • [#3130]: Add version information for failed cli migration (#3129) [[@FlakM]]
      • Breaking changes to MigrateError.
    • [#3181]: feat: no tx migration [[@cleverjam]]
      • (Postgres only) migrations that should not run in a transaction can be flagged by adding -- no-transaction to the beginning.
      • Breaking change: added field to Migration
    • [#3184]: [BREAKING} fix(sqlite): always use i64 as intermediate when decoding [[@abonander]]
      • integer decoding will now loudly error on overflow instead of silently truncating.
      • some usages of the query!() macros might change an i32 to an i64.
    • [#3252]: fix #[derive(sqlx::Type)] in Postgres [[@abonander]]
      • Manual implementations of PgHasArrayType for enums will conflict with the generated one. Delete the manual impl or add #[sqlx(no_pg_array)] where conflicts occur.
      • Type equality for PgTypeInfo is now schema-aware.
    • [#3329]: fix: correct handling of arrays of custom types in Postgres [[@abonander]]
      • Potential breaking change: PgTypeInfo::with_name() infers types that start with _ to be arrays of the un-prefixed type. Wrap type names in quotes to bypass this behavior.
    • [#3356]: breaking: fix name collision in FromRow, return Error::ColumnDecode for TryFrom errors [[@abonander]]
      • Breaking behavior change: errors with #[sqlx(try_from = "T")] now return Error::ColumnDecode instead of Error::ColumnNotFound.
      • Breaking because #[sqlx(default)] on an individual field or the struct itself would have previously suppressed the error. This doesn't seem like good behavior as it could result in some potentially very difficult bugs.
        • Instead, create a wrapper implementing From and apply the default explicitly.
    • [#3337]: allow rename with rename_all (close #2896) [[@DirectorX]]
      • Changes the precedence of #[sqlx(rename)] and #[sqlx(rename_all)] to match the expected behavior (rename wins).
    • [#3285]: fix: use correct names for sslmode options [[@lily-mosquitoes]]
      • Changes the output of ConnectOptions::to_url_lossy() to match what parsing expects.

    Added

    • [#2917]: Add Debug impl for PgRow [[@g-bartoszek]]
    • [#3113]: feat: new derive feature flag [[@saiintbrisson]]
    • [#3154]: feat: add MySqlTime, audit mysql::types for panics [[@abonander]]
    • [#3188]: feat(cube): support postgres cube [[@jayy-lmao]]
    • [#3244]: feat: support NonZero* scalar types [[@AlphaKeks]]
    • [#3260]: feat: Add set_update_hook on SqliteConnection [[@gridbox]]
    • [#3291]: feat: support the Postgres Bool type for the Any driver [[@etorreborre]]
    • [#3293]: Add LICENSE-* files to crates [[@LecrisUT]]
    • [#3303]: add array support for NonZeroI* in postgres [[@JohannesIBK]]
    • [#3311]: Add example on how to use Transaction as Executor [[@Lachstec]]
    • [#3343]: Add support for PostgreSQL HSTORE data type [[@KobusEllis]]

    Changed

    • [#2652]: MySQL: Remove collation compatibility check for strings [[@alu]]
    • [#2960]: Removed Send trait bound from argument binding [[@bobozaur]]
    • [#2970]: refactor: lift type mappings into driver crates [[@abonander]]
    • [#3148]: Bump libsqlite3-sys to v0.28 [[@NfNitLoop]]
      • Note: version bumps to libsqlite3-sys are not considered breaking changes as per our semver guarantees.
    • [#3265]: perf: box MySqlConnection to reduce sizes of futures [[@stepantubanov]]
    • [#3352]: chore:added a testcase for sqlx migrate add ... [[@CommanderStorm]]
    • [#3340]: ci: Add job to check that sqlx builds with its declared minimum dependencies [[@iamjpotts]]

    Fixed

    • [#2702]: Constrain cyclic associated types to themselves [[@BadBastion]]
    • [#2954]: Fix several inter doc links [[@ralpha]]
    • [#3073]: feat(logging): Log slow acquires from connection pool [[@iamjpotts]]
    • [#3137]: SqliteConnectOptions::filename() memory fix (#3136) [[@hoxxep]]
    • [#3138]: PostgreSQL Bugfix: Ensure connection is usable after failed COPY inside a transaction [[@feikesteenbergen]]
    • [#3146]: fix(sqlite): delete unused ConnectionHandleRaw type [[@abonander]]
    • [#3162]: Drop urlencoding dependency [[@paolobarbolini]]
    • [#3165]: Bump deps that do not need code changes [[@GnomedDev]]
    • [#3167]: fix(ci): use docker compose instead of docker-compose [[@abonander]]
    • [#3172]: fix: Option decoding in any driver [[@pxp9]]
    • [#3173]: fix(postgres) : int type conversion while decoding [[@RaghavRox]]
    • [#3190]: Update time to 0.3.36 [[@BlackSoulHub]]
    • [#3191]: Fix unclean TLS shutdown [[@levkk]]
    • [#3194]: Fix leaking connections in fetch_optional (#2647) [[@danjpgriffin]]
    • [#3216]: security: bump rustls to 0.21.11 [[@toxeus]]
    • [#3230]: fix: sqlite pragma order for auto_vacuum [[@jasonish]]
    • [#3233]: fix: get_filename should not consume self [[@jasonish]]
    • [#3234]: fix(ci): pin Rust version, ditch unmaintained actions [[@abonander]]
    • [#3236]: fix: resolve path ownership problems when using sqlx_macros_unstable [[@lily-mosquitoes]]
    • [#3254]: fix: hide sqlx_postgres::any [[@Zarathustra2]]
    • [#3266]: ci: MariaDB - add back 11.4 and add 11.5 [[@grooverdan]]
    • [#3267]: ci: syntax fix [[@grooverdan]]
    • [#3271]: docs(sqlite): fix typo - unixtime() -> unixepoch() [[@joelkoen]]
    • [#3276]: Invert boolean for migrate error message. (#3275) [[@nk9]]
    • [#3279]: fix Clippy errors [[@abonander]]
    • [#3288]: fix: sqlite update_hook char types [[@jasonish]]
    • [#3297]: Pass the persistent query setting when preparing queries with the Any driver [[@etorreborre]]
    • [#3298]: Track null arguments in order to provide the appropriate type when converting them. [[@etorreborre]]
    • [#3312]: doc: Minor rust docs fixes [[@SrGesus]]
    • [#3327]: chore: fixed one usage of select_input_type!() being unhygenic [[@CommanderStorm]]
    • [#3328]: fix(ci): comment not separated from other characters [[@hamirmahal]]
    • [#3341]: refactor: Resolve cargo check warnings in postgres examples [[@iamjpotts]]
    • [#3346]: fix(postgres): don't panic if M or C Notice fields are not UTF-8 [[@YgorSouza]]
    • [#3350]: fix:the json-feature should activate sqlx-postgres?/json as well [[@CommanderStorm]]
    • [#3353]: fix: build script new line at eof [[@Zarthus]]
    • (no PR): activate clock and std features of workspace.dependencies.chrono.
    Open source →
  10. 0.7.4 12 Mar 2024
    Release notes

    fix: deprecation in postgres::types::chrono

    Open source →
    Release notes

    38 pull requests were merged this release cycle.

    This is officially the last release of the 0.7.x release cycle.

    As of this release, development of 0.8.0 has begun on main and only high-priority bugfixes may be backported.

    Added

    • [#2891]: feat: expose getters for connect options fields [[@saiintbrisson]]
    • [#2902]: feat: add to_url_lossy to connect options [[@lily-mosquitoes]]
    • [#2927]: Support query! for cargo-free systems [[@kshramt]]
    • [#2997]: doc(FAQ): add entry explaining prepared statements [[@abonander]]
    • [#3001]: Update README to clarify MariaDB support [[@iangilfillan]]
    • [#3004]: feat(logging): Add numeric elapsed time field elapsed_secs [[@iamjpotts]]
    • [#3007]: feat: add raw_sql API [[@abonander]]
      • This hopefully makes it easier to find how to execute statements which are not supported by the default prepared statement interfaces query*() and query!().
      • Improved documentation across the board for the query*() functions.
      • Deprecated: execute_many() and fetch_many() on interfaces that use prepared statements.
        • Multiple SQL statements in one query string were only supported by SQLite because its prepared statement interface is the only way to execute SQL. All other database flavors forbid multiple statements in one prepared statement string as an extra defense against SQL injection.
        • The new raw_sql API retains this functionality because it explicitly does not use prepared statements. Raw or text-mode query interfaces generally allow multiple statements in one query string, and this is supported by all current databases. Due to their nature, however, one cannot use bind parameters with them.
        • If this change affects you, an issue is open for discussion: https://github.com/launchbadge/sqlx/issues/3108
    • [#3011]: Added support to IpAddr with MySQL/MariaDB. [[@Icerath]]
    • [#3013]: Add default implementation for PgInterval [[@pawurb]]
    • [#3018]: Add default implementation for PgMoney [[@pawurb]]
    • [#3026]: Update docs to reflect support for MariaDB data types [[@iangilfillan]]
    • [#3037]: feat(mysql): allow to connect with mysql driver without default behavor [[@darkecho731]]

    Changed

    • [#2900]: Show latest url to docs for macro.migrate [[@Vrajs16]]
    • [#2914]: Use create_new instead of atomic-file-write [[@mattfbacon]]
    • [#2926]: docs: update example for PgConnectOptions [[@Fyko]]
    • [#2989]: sqlx-core: Remove dotenvy dependency [[@joshtriplett]]
    • [#2996]: chore: Update ahash to 0.8.7 [[@takenoko-gohan]]
    • [#3006]: chore(deps): Replace unmaintained tempdir crate with tempfile [[@iamjpotts]]
    • [#3008]: chore: Ignore .sqlx folder created by running ci steps locally [[@iamjpotts]]
    • [#3009]: chore(dev-deps): Upgrade env_logger from 0.9 to 0.11 [[@iamjpotts]]
    • [#3010]: chore(deps): Upgrade criterion to 0.5.1 [[@iamjpotts]]
    • [#3050]: Optimize SASL auth in sqlx-postgres [[@mirek26]]
    • [#3055]: Set TCP_NODELAY option on TCP sockets [[@mirek26]]
    • [#3065]: Improve max_lifetime handling [[@mirek26]]
    • [#3072]: Change the name of "inner" function generated by #[sqlx::test] [[@ciffelia]]
    • [#3083]: Remove sha1 because it's not being used in postgres [[@rafaelGuerreiro]]

    Fixed

    • [#2898]: Fixed docs [[@Vrajs16]]
    • [#2905]: fix(mysql): Close prepared statement if persistence is disabled [[@larsschumacher]]
    • [#2913]: Fix handling of deferred constraints [[@Thomasdezeeuw]]
    • [#2919]: fix duplicate "`" in FromRow "default" attribute doc comment [[@shengsheng]]
    • [#2932]: fix(postgres): avoid unnecessary flush in PgCopyIn::read_from [[@tsing]]
    • [#2955]: Minor fixes [[@Dawsoncodes]]
    • [#2963]: Fixed ReadMe badge styling [[@tadghh]]
    • [#2976]: fix: AnyRow not support PgType::Varchar [[@holicc]]
    • [#3053]: fix: do not panic when binding a large BigDecimal [[@Ekleog]]
    • [#3056]: fix: spans in sqlite tracing (#2876) [[@zoomiti]]
    • [#3089]: fix(migrate): improve error message when parsing version from filename [[@abonander]]
    • [#3098]: Migrations fixes [[@abonander]]
      • Unhides sqlx::migrate::Migrator.
      • Improves I/O error message when failing to read a file in migrate!().
    Open source →
  11. 0.7.3 23 Nov 2023
    Release notes

    38 pull requests were merged this release cycle.

    Added

    • [#2478]: feat(citext): support postgres citext [[@hgranthorner]]
    • [#2545]: Add fixtures_path in sqlx::test args [[@ripa1995]]
    • [#2665]: feat(mysql): support packet splitting [[@tk2217]]
    • [#2752]: Enhancement #2747 Provide fn PgConnectOptions::get_host(&self) [[@boris-lok]]
    • [#2769]: Customize the macro error message based on the metadata [[@Nemo157]]
    • [#2793]: derived Hash trait for PgInterval [[@yasamoka]]
    • [#2801]: derive FromRow: sqlx(default) for all fields [[@grgi]]
    • [#2827]: Add impl FromRow for the unit type [[@nanoqsh]]
    • [#2871]: Add MySqlConnectOptions::get_database() [[@shiftrightonce]]
    • [#2873]: Sqlx Cli: Added force flag to drop database for postgres [[@Vrajs16]]
    • [#2894]: feat: Text adapter [[@abonander]]

    Changed

    • [#2701]: Remove documentation on offline feature [[@Baptistemontan]]
    • [#2713]: Add additional info regarding using Transaction and PoolConnection as… [[@satwanjyu]]
    • [#2770]: Update README.md [[@snspinn]]
    • [#2797]: doc(mysql): document behavior regarding BOOLEAN and the query macros [[@abonander]]
    • [#2803]: Don't use separate temp dir for query jsons (2) [[@mattfbacon]]
    • [#2819]: postgres begin cancel safe [[@conradludgate]]
    • [#2832]: Update extra_float_digits default to 2 instead of 3 [[@brianheineman]]
    • [#2865]: Update Faq - Bulk upsert with optional fields [[@Vrajs16]]
    • [#2880]: feat: use specific message for slow query logs [[@abonander]]
    • [#2882]: Do not require db url for prepare [[@tamasfe]]
    • [#2890]: doc(sqlite): cover lack of NUMERIC support [[@abonander]]
    • [No PR]: Upgraded libsqlite3-sys to 0.27.0
      • Note: linkage to libsqlite3-sys is considered semver-exempt; see the release notes for 0.7.0 below for details.

    Fixed

    • [#2640]: fix: sqlx::macro db cleanup race condition by adding a margin to current timestamp [[@fhsgoncalves]]
    • [#2655]: [fix] Urlencode when passing filenames to sqlite3 [[@uttarayan21]]
    • [#2684]: Make PgListener recover from UnexpectedEof [[@hamiltop]]
    • [#2688]: fix: Make rust_decimal and bigdecimal decoding more lenient [[@cameronbraid]]
    • [#2754]: Is tests/x.py maintained? And I tried fix it. [[@qwerty2501]]
    • [#2784]: fix: decode postgres time without subsecond [[@granddaifuku]]
    • [#2806]: Depend on version of async-std with non-private spawn-blocking [[@A248]]
    • [#2820]: fix: correct decoding of rust_decimal::Decimal for high-precision values [[@abonander]]
    • [#2822]: issue #2821 Update error handling logic when opening a TCP connection [[@anupj]]
    • [#2826]: chore: bump some sqlx-core dependencies [[@djc]]
    • [#2838]: Fixes rust_decimal scale for Postgres [[@jkleinknox]]
    • [#2847]: Fix comment in sqlx migrate add help text [[@cryeprecision]]
    • [#2850]: fix(core): avoid unncessary wakeups in try_stream!() [[@abonander]]
    • [#2856]: Prevent warnings running cargo build [[@nyurik]]
    • [#2864]: fix(sqlite): use AtomicUsize for thread IDs [[@abonander]]
    • [#2892]: Fixed force dropping bug [[@Vrajs16]]
    Open source →
  12. 0.7.2 26 Sep 2023
    Release notes

    chore: prepare 0.7.2 release (#2782)

    Open source →
    Release notes

    23 pull requests were merged this release cycle.

    Added

    • [#2121]: Add JSON support to FromRow derive [[@95ulisse]]
    • [#2533]: Implement mysql_clear_password [[@ldanilek]]
    • [#2538]: cli: add --target-version CLI flags for migrate run/revert [[@inahga]]
    • [#2577]: supplement Postgres listen example with a small chat example [[@JockeM]]
    • [#2602]: Support naming migrations sequentially [[@vmax]]
    • [#2634]: Adding PgHasArrayType for &[u8;N] [[@snf]]
    • [#2646]: Support for setting client certificate and key from bytes [[@wyhaya]]
    • [#2664]: Automatically infer migration type [[@vmax]]
    • [#2712]: Add impl for Type, Decode, and Encode for Box<str> and Box<[u8]> [[@grant0417]]

    Changed

    • [#2650]: Cleanup format arguments [[@nyurik]]
    • [#2695]: remove &mut PoolConnection from Executor docs [[@olback]]
      • This impl was removed in 0.7.0 because of coherence issues.
    • [#2706]: Clarify where optional features should be enabled [[@kryptan]]
    • [#2717]: Update README.md [[@fermanjj]]
    • [#2739]: Bump mariadb CI images + mysql unpin [[@grooverdan]]
    • [#2742]: Implemented poll_flush for Box<S:Socket> [[@bobozaur]]
    • [#2740]: Remove sealed trait comments from documentation [[@bobozaur]]
    • [#2750]: Fix #2384, bump flume to v0.11.0 [[@madadam]]
    • [#2757]: Remove unused remove_dir_all crate from sqlx-cli, fixes RUSTSEC-2023-0018 [[@aldur]]

    Fixed

    • [#2624]: Documentation typo: BYTE -> BINARY [[@sebastianv89]]
    • [#2628]: docs: 0.7 is stable in the entire README [[@marcusirgens]]
    • [#2630]: fix(postgres): fix buffer management in PgCopyIn::read_from [[@tsing]]
    • [#2651]: Chore: Fix few build warnings, and make CI fail on warn [[@nyurik]]
    • [#2670]: fix: ignore extra fields in Postgres describe parsing [[@abonander]]
    • [#2687]: docs: Fix description of min_connections [[@hakoerber]]
    Open source →
  13. 0.7.1 15 Jul 2023
    Release notes

    This release mainly addresses issues reported with the 0.7.0 release.

    16 pull requests were merged this release cycle.

    Added

    • [#2551]: Introduce build_query_scalar for QueryBuilder [[@iamquang95]]
    • [#2605]: Implement Default for QueryBuilder [[@Xydez]]
    • [#2616]: feat(sqlx-core): add table function to database error [[@saiintbrisson]]
    • [#2619]: feat: allow opt-out of PgHasArrayType with #[derive(sqlx::Type)] [[@abonander]]
      • TL;DR: if you're getting errors from #[derive(sqlx::Type)] with #[sqlx(transparent)] regarding PgHasArrayType not being implemented, add #[sqlx(no_pg_array)] to fix.

    Changed

    • [#2566]: improve docs about migration files [[@jnnnnn]]
    • [#2576]: Major Version Update clap to 4.0 [[@titaniumtraveler]]
    • [#2597]: Bump webpki-roots to v0.24 [[@paolobarbolini]]
    • [#2603]: docs(changelog): be more verbose about offline mode breaking change [[@mrl5]]

    Fixed

    • [#2553]: Implement Clone for PoolOptions manually (#2548) [[@alilleybrinker]]
    • [#2580]: Update README.md now that 0.7.0 is no longer in alpha [[@saolof]]
    • [#2585]: Fix for Issue #2549 - cannot use feature "rust_decimal" without also using "bigdecimal" [[@deneut]]
    • [#2586]: Fix optional dependency on sqlx-macros [[@kitterion]]
    • [#2593]: Correct mention of the tls-native-tls in the documentation. [[@denschub]]
    • [#2599]: Remove incorrect CAST in test database cleanup for MySQL. [[@fd]]
    • [#2613]: Fix readme.md to reduce confusion about optional features (decimal->rust_decimal) [[@vabka]]
    • [#2620]: fix(sqlite/any): encode bool as integer [[@saiintbrisson]]
    Open source →
  14. 0.7.0 03 Jul 2023
    Release notes

    At least 70 pull requests were merged this release cycle! (The exact count is muddied with pull requests for alpha releases and such.) And we gained 43 new contributors! Thank you to everyone who helped make this release a reality.

    Breaking

    Many revisions were made to query analysis in the SQLite driver; these are all potentially breaking changes as they can change the output of sqlx::query!() et al. We'd like to thank [[@tyrelr]] for their numerous PRs to this area.

    The MSSQL driver has been removed as it was not nearly at the same maturity level as the other drivers. As previously announced, we have plans to introduce a fully featured replacement as a premium offering, alongside drivers for other proprietary databases, with the goal to support full-time development on SQLx.

    If interested, please email your inquiry to [email protected].

    The offline mode for the queries has been changed to use a separate file per query!() invocation, which is intended to reduce the number of conflicts when merging branches in a project that both modified queries. This means that CLI flag --merged is no longer supported. See [#2363] for details and make sure that your sqlx-cli version is in sync with the sqlx version in your project.

    The type ascription override syntax for the query macros has been deprecated, as parse support for it has been removed in syn 2.0, which we'll be upgrading to in the next breaking release. This can be replaced with type overrides using casting syntax (as). See [#2483] for details.

    • [#1946]: Fix compile time verification performance regression for sqlite [[@liningpan]]
    • [#1960]: Fix sqlite update return and order by type inference [[@tyrelr]]
    • [#1984]: Sqlite EXPLAIN type inference improvements [[@rongcuid]]
    • [#2039]: Break drivers out into separate crates, clean up some technical debt [[@abonander]]
      • All deprecated items have been removed.
      • The mssql feature and associated database driver has been deleted from the source tree. It will return as part of our planned SQLx Pro offering as a from-scratch rewrite with extra features (such as TLS) and type integrations that were previously missing.
      • The runtime-actix-* features have been deleted. They were previously changed to be aliases of their runtime-tokio-* counterparts for backwards compatibility reasons, but their continued existence is misleading as SQLx has no special knowledge of Actix anymore.
        • To fix, simply replace the runtime-actix-* feature with its runtime-tokio-* equivalent.
      • The git2 feature has been removed. This was a requested integration from a while ago that over time made less and less sense to be part of SQLx itself. We have to be careful with the crates we add to our public API as each one introduces yet another semver hazard. The expected replacement is to make #[derive(sqlx::Type)] useful enough that users can write wrapper types for whatever they want to use without SQLx needing to be specifically aware of it.
      • The Executor impls for Transaction and PoolConnection have been deleted because they cannot exist in the new crate architecture without rewriting the Executor trait entirely.
        • To fix this breakage, simply add a dereference where an impl Executor is expected, as they both dereference to the inner connection type which will still implement it:
          • &mut transaction -> &mut *transaction
          • &mut connection -> &mut *connection
        • These cannot be blanket impls as it triggers an overflow in the compiler due to the lack of lazy normalization, and the driver crates cannot provide their own impls due to the orphan rule.
        • We're expecting to do another major refactor of traits to incorporate generic associated types (GAT). This will mean another major release of SQLx but ideally most API usage will not need to change significantly, if at all.
      • The fields of Migrator are now #[doc(hidden)] and semver-exempt; they weren't meant to be public.
      • The offline feature has been removed from the sqlx facade crate and is enabled unconditionally as most users are expected to have enabled it anyway and disabling it doesn't seem to appreciably affect compile times.
      • The decimal feature has been renamed to rust_decimal to match the crate it actually provides integrations for.
      • AnyDriver and AnyConnection now require either sqlx::any::install_drivers() or sqlx::any::install_default_drivers() to be called at some point during the process' lifetime before the first connection is made, as the set of possible drivers is now determined at runtime. This was determined to be the least painful way to provide knowledge of database drivers to Any without them being hardcoded.
      • The AnyEncode trait has been removed.
    • [#2109]: feat: better database errors [[@saiintbrisson]]
    • [#2094]: Update libsqlite3-sys to 0.25.1 [[@penberg]]
      • Alongside this upgrade, we are now considering the linkage to libsqlite3-sys to be semver-exempt, and we reserve the right to upgrade it as necessary. If you are using libsqlite3-sys directly or a crate that links it such as rusqlite, you should pin the versions of both crates to avoid breakages from cargo update:
    [dependencies]
    sqlx = { version = "=0.7.0", features = ["sqlite"] }
    rusqlite = "=0.29.0"
    
    • [#2132]: fix: use owned Builder pattern for ConnectOptions [[@ar3s3ru]]
    • [#2253]: Sqlite describe fixes [[@tyrelr]]
    • [#2285]: time: Assume UTC when decoding a DATETIME column in sqlite [[@nstinus]]
    • [#2363]: [offline] Change prepare to one-file-per-query [[@cycraig]]
    • [#2387]: PATCH: bump libsqlite3-sys to patched version [[@grantkee]]
    • [#2409]: fix(#2407): respect the HaltIfNull opcode when determining nullability [[@arlyon]]
    • [#2459]: limit the number of instructions that can be evaluated [[@tyrelr]]
    • [#2467]: Add and improve sqlite describe performance benchmarks [[@tyrelr]]
    • [#2491]: sqlite date macro support [[@Arcayr]]
      • Changes OffsetDateTime to be the first type used when deserializing a timestamp type.
    • [#2496]: Bump to libsqlite3-sys 0.26 [[@mdecimus]]
    • [#2508]: Sqlite analytical [[@tyrelr]]

    Added

    • [#1850]: Add client SSL authentication using key-file for Postgres, MySQL and MariaDB [[@ThibsG]]
    • [#2088]: feat: Add set_connect_options method to Pool [[@moatra]]
    • [#2113]: Expose PoolOptions for reading [[@FSMaxB]]
    • [#2115]: Allow using complex types in try_from when deriving FromRow [[@95ulisse]]
    • [#2116]: [SQLite] Add option to execute PRAGMA optimize; on close of a connection [[@miles170]]
    • [#2189]: Added regexp support in sqlite [[@VictorKoenders]]
    • [#2224]: Add From impls for Json [[@dbeckwith]]
    • [#2256]: add progress handler support to sqlite [[@nbaztec]]
    • [#2366]: Allow ignoring attributes for deriving FromRow [[@grgi]]
    • [#2369]: new type support in query_as [[@0xdeafbeef]]
    • [#2379]: feat: add Connection::shrink_buffers, PoolConnection::close [[@abonander]]
    • [#2400]: fix(docs): example of sqlx_macros_unstable in config.toml [[@df51d]]
    • [#2469]: Add Simple format for Uuid for MySQL & SQLite. [[@MidasLamb]]
    • [#2483]: chore: add deprecation notice for type ascription use [[@saiintbrisson]]
    • [#2506]: add args to query builder (#2494) [[@cemoktra]]
    • [#2554]: Impl AsMut for advisory lock types (#2520) [[@alilleybrinker]]
    • [#2559]: Add CLI autocompletion using clap_complete [[@titaniumtraveler]]

    Changed

    • [#2185]: Initial work to switch to tracing [[@CosmicHorrorDev]]
    • [#2193]: Start testing on Postgres 15 and drop Postgres 10 [[@paolobarbolini]]
    • [#2213]: Use let else statements in favor of macro [[@OverHash]]
    • [#2365]: Update dependencies [[@paolobarbolini]]
    • [#2371]: Disable rustls crate logging feature by default up to date [[@sergeiivankov]]
    • [#2373]: chore: Use tracing's fields to get structured logs [[@jaysonsantos]]
    • [#2393]: Lower default logging level for statements to Debug [[@bnoctis]]
    • [#2445]: Traverse symlinks when resolving migrations [[@tgeoghegan]]
    • [#2485]: chore(sqlx-postgres): replace dirs with home & etcetera [[@utkarshgupta137]]
    • [#2515]: Bump mac_address to 1.1.5 [[@repnop]]
    • [#2440]: Update rustls to 0.21, webpki-roots to 0.23 [[@SergioBenitez]]
    • [#2563]: Update rsa to 0.9 [[@paolobarbolini]]
    • [#2564]: Update bitflags to v2 [[@paolobarbolini]]
    • [#2565]: Bump indexmap and ahash [[@paolobarbolini]]
    • [#2574]: doc: make it clear that ConnectOptions types impl FromStr [[@abonander]]

    Fixed

    • [#2098]: Fix sqlite compilation [[@cycraig]]
    • [#2120]: fix logical merge conflict [[@tyrelr]]
    • [#2133]: Postgres OID resolution query does not take into account current search_path [[@95ulisse]]
    • [#2156]: Fixed typo. [[@cdbfoster]]
    • [#2179]: fix: ensures recover from fail with PgCopyIn [[@andyquinterom]]
    • [#2200]: Run CI on *-dev branch [[@joehillen]]
    • [#2222]: Add context to confusing sqlx prepare parse error [[@laundmo]]
    • [#2271]: feat: support calling Postgres procedures with the macros [[@bgeron]]
    • [#2282]: Don't run EXPLAIN nullability analysis on Materialize [[@benesch]]
    • [#2319]: Set whoami default-features to false [[@thedodd]]
    • [#2352]: Preparing 0.7.0-alpha.1 release [[@abonander]]
    • [#2355]: Fixed the example code for sqlx::test [[@kenkoooo]]
    • [#2367]: Fix sqlx-cli create, drop, migrate [[@cycraig]]
    • [#2376]: fix(pool): close when last handle is dropped, extra check in try_acquire [[@abonander]]
    • [#2378]: Fix README build badge [[@dbrgn]]
    • [#2398]: fix(prepare): store temporary query files inside the workspace [[@aschey]]
    • [#2402]: fix: drop old time 0.1.44 dep [[@codahale]]
    • [#2413]: fix(macros-core): use of undeclared tracked_path [[@df51d]]
    • [#2420]: Enable runtime-tokio feature of sqlx when building sqlx-cli [[@paolobarbolini]]
    • [#2453]: in README.md, correct spelling and grammar [[@vizvasrj]]
    • [#2454]: fix: ensure fresh test db's aren't accidentally deleted by do_cleanup [[@phlip9]]
    • [#2507]: Exposing the Oid of PostgreSQL types [[@Razican]]
    • [#2519]: Use ::std::result::Result::Ok in output.rs [[@southball]]
    • [#2569]: Fix broken links to mysql error documentation [[@titaniumtraveler]]
    • [#2570]: Add a newline to the generated JSON files [[@nyurik]]
    • [#2572]: Do not panic when PrepareOk fails to decode [[@stepantubanov]]
    • [#2573]: fix(sqlite) Do not drop notify mutex guard until after condvar is triggered [[@andrewwhitehead]]
    Open source →
  15. 0.7.0-alpha.3 11 May 2023 pre-release

    Nothing published for this version

  16. 0.7.0-alpha.2 17 Mar 2023 pre-release

    Nothing published for this version

  17. 0.7.0-alpha.1 22 Feb 2023 pre-release

    Nothing published for this version

  18. 0.6.3 21 Mar 2023
    Release notes

    This is a hotfix to address the breakage caused by transitive dependencies upgrading to syn = "2".

    We set default-features = false for our dependency on syn = "1" to be good crates.io citizens, but failed to enable the features we actually used, which went undetected because we transitively depended on syn with the default features enabled through other crates, and so they were also on for us because features are additive.

    When those other dependencies upgraded to syn = "2" it was no longer enabling those features for us, and so compilation broke for projects that don't also depend on syn = "1", transitively or otherwise.

    There is no PR for this fix as there was no longer a dedicated development branch for 0.6, but discussion can be found in issue #2418.

    As of this release, the 0.7 release is in alpha and so development is no longer occurring against 0.6. This fix will be forward-ported to 0.7.

    Open source →
  19. 0.6.2 14 Sep 2022
    Release notes

    25 pull requests were merged this release cycle.

    Added

    • [#1081]: Add try_from attribute for FromRow derive [[@zzhengzhuo]]
      • Exemplifies "out of sight, out of mind." It's surprisingly easy to forget about PRs when they get pushed onto the second page. We'll be sure to clean out the backlog for 0.7.0.
    • [#2014]: Support additional SQLCipher options in SQLite driver. [[@szymek156]]
    • [#2052]: Add issue templates [[@abonander]]
    • [#2053]: Add documentation for IpAddr support in Postgres [[@rakshith-ravi]]
    • [#2062]: Add extension support for SQLite [[@bradfier]]
    • [#2063]: customizable db locking during migration [[@fuzzbuck]]

    Changed

    • [#2025]: Bump sqlformat to 2.0 [[@NSMustache]]
    • [#2056]: chore: Switch to sha1 crate [[@stoically]]
    • [#2071]: Use cargo check consistently in prepare [[@cycraig]]

    Fixed

    • [#1991]: Ensure migration progress is not lost for Postgres, MySQL and SQLite. [[@crepererum]]
    • [#2023]: Fix expansion of #[sqlx(flatten)] for FromRow derive [[@RustyYato]]
    • [#2028]: Use fully qualified path when forwarding to #[test] from #[sqlx::test] [[@alexander-jackson]]
    • [#2040]: Fix typo in FromRow docs [[@zlidner]]
    • [#2046]: added flag for PIPES_AS_CONCAT connection setting for MySQL to fix #2034 [[@marcustut]]
    • [#2055]: Use unlock notify also on sqlite3_exec [[@madadam]]
    • [#2057]: Make begin,commit,rollback cancel-safe in sqlite [[@madadam]]
    • [#2058]: fix typo in documentation [[@lovasoa]]
    • [#2067]: fix(docs): close code block in query_builder.rs [[@abonander]]
    • [#2069]: Fix prepare race condition in workspaces [[@cycraig]]\
      • NOTE: this changes the directory structure under target/ that cargo sqlx prepare depends on. If you use offline mode in your workflow, please rerun cargo install sqlx-cli to upgrade.
    • [#2072]: SqliteConnectOptions typo [[@fasterthanlime]]
    • [#2074]: fix: mssql uses unsigned for tinyint instead of signed [[@he4d]]
    • [#2081]: close unnamed portal after each executed extended query [[@DXist]]
    • [#2086]: PgHasArrayType for transparent types fix. [[@Wopple]]
      • NOTE: this is a breaking change and has been postponed to 0.7.0.
    • [#2089]: fix: Remove default chrono dep on time for sqlx-cli [[@TravisWhitehead]]
    • [#2091]: Sqlite explain plan log efficiency [[@tyrelr]]
    Open source →
  20. 0.6.1 03 Aug 2022
    Release notes

    33 pull requests were merged this release cycle.

    Added

    • [#1495]: Add example for manual implementation of the FromRow trait [[@Erik1000]]
    • [#1822]: (Postgres) Add support for std::net::IpAddr [[@meh]]
      • Decoding returns an error if the INET value in Postgres is a prefix and not a full address (/32 for IPv4, /128 for IPv6).
    • [#1865]: Add SQLite support for the time crate [[@johnbcodes]]
    • [#1902]: Add an example of how to use QueryBuilder::separated() [[@sbeckeriv]]
    • [#1917]: Added docs for sqlx::types::Json [[@jayy-lmao]]
    • [#1919]: Implement Clone for PoolOptions [[@Thomasdezeeuw]]
    • [#1953]: Support Rust arrays in Postgres [[@e00E]]
    • [#1954]: Add push_tuples for QueryBuilder [[@0xdeafbeef]]
    • [#1959]: Support #[sqlx(flatten)] attribute in FromRow [[@TheoOiry]]
    • [#1967]: Add example with external query files [[@JoeyMckenzie]]
    • [#1985]: Add query_builder::Separated::push_bind_unseparated() [[@0xdeafbeef]]
    • [#2001]: Implement #[sqlx::test] for general use
      • Includes automatic database management, migration and fixture application.
      • Drops support for end-of-lifed database versions, see PR for details.
    • [#2005]: QueryBuilder improvements [[@abonander]]
      • Raw SQL getters, new method to build QueryAs instead of Query.
    • [#2013]: (SQLite) Allow VFS to be set as URL query parameter [[@liningpan]]

    Changed

    • [#1679]: refactor: alias actix-* features to their equivalent tokio-* features [[@robjtede]]
    • [#1906]: replaced all uses of "uri" to "url" [[@RomainStorai]]
    • [#1965]: SQLite improvements [[@abonander]]
    • [#1977]: Docs: clarify relationship between query_as!() and FromRow [[@abonander]]
    • [#2003]: Replace dotenv with dotenvy [[@abonander]]

    Fixed

    • [#1802]: Try avoiding a full clean in cargo sqlx prepare --merged [[@LovecraftianHorror]]
    • [#1848]: Fix type info access in Any database driver [[@raviqqe]]
    • [#1910]: Set CARGO_TARGET_DIR when compiling queries [[@sedrik]]
    • [#1915]: Pool: fix panic when using callbacks [[@abonander]]
    • [#1930]: Don't cache SQLite connection for macros [[@LovecraftianHorror]]
    • [#1948]: Fix panic in Postgres BYTEA decode [[@e00E]]
    • [#1955]: Fix typo in FAQ [[@kenkoooo]]
    • [#1968]: (Postgres) don't panic if S or V notice fields are not UTF-8 [[@abonander]]
    • [#1969]: Fix sqlx-cli build [[@ivan]]
    • [#1974]: Use the rust-cache action for CI [[@abonander]]
    • [#1988]: Agree on a single default runtime for the whole workspace [[@crepererum]]
    • [#1989]: Fix panics in PgListener [[@crepererum]]
    • [#1990]: Switch master to main in docs [[@crepererum]]
      • The change had already been made in the repo, the docs were out of date.
    • [#1993]: Update versions in quickstart examples in README [[@UramnOIL]]
    Open source →
  21. 0.6.0 16 Jun 2022
    Release notes

    This release marks the end of the 0.5.x series of releases and contains a number of breaking changes, mainly to do with backwards-incompatible dependency upgrades.

    As we foresee many more of these in the future, we surveyed the community on how to handle this; the consensus appears to be "just release breaking changes more often."

    As such, we expect the 0.6.x release series to be a shorter one.

    39 pull requests(!) (not counting "prepare 0.5.12 release", of course) were merged this release cycle.

    Breaking

    • [#1384]: (Postgres) Move server_version_num from trait to inherent impl [[@AtkinsChang]]
    • [#1426]: Bump ipnetwork to 0.19 [[@paolobarbolini]]
    • [#1455]: Upgrade time to 0.3 [[@paolobarbolini]]
    • [#1505]: Upgrade rustls to 0.20 [[@paolobarbolini]]
      • Fortunately, future upgrades should not be breaking as webpki is no longer exposed in the API.
    • [#1529]: Upgrade bigdecimal to 0.3 [[@e00E]]
    • [#1602]: postgres: use Oid everywhere instead of u32 [[@paolobarbolini]]
      • This drops the Type, Decode, Encode impls for u32 for Postgres as it was misleading. Postgres doesn't support unsigned ints without using an extension. These impls were decoding Postgres OIDs as bare u32s without any context (and trying to bind a u32 to a query would produce an OID value in SQL). This changes that to use a newtype instead, for clarity.
    • [#1612]: Make all ConnectOptions types cloneable [[@05storm26]]
    • [#1618]: SQLite chrono::DateTime<FixedOffset> timezone fix [[@05storm26]]
      • DateTime<FixedOffset> will be stored in SQLite with the correct timezone instead of always in UTC. This was flagged as a "potentially breaking change" since it changes how dates are sent to SQLite.
    • [#1733]: Update git2 to 0.14 [[@joshtriplett]]
    • [#1734]: Make PgLTree::push() infallible and take PgLTreeLabel directly [[@sebpuetz]]
    • [#1785]: Fix Rust type for SQLite REAL [[@pruthvikar]]
      • Makes the macros always map a REAL column to f64 instead of f32 as SQLite uses only 64-bit floats.
    • [#1816]: Improve SQLite support for sub-queries and CTEs [[@tyrelr]]
      • This likely will change the generated code for some invocations sqlx::query!() with SQLite.
    • [#1821]: Update uuid crate to v1 [[@paolobarbolini]]
    • [#1901]: Pool fixes and breaking changes [[@abonander]]
      • Renamed PoolOptions::connect_timeout to acquire_timeout for clarity.
      • Changed the expected signatures for PoolOptions::after_connect, before_acquire, after_release
      • Changed the signature for Pool::close() slightly
        • Now eagerly starts the pool closing, .awaiting is only necessary if you want to ensure a graceful shutdown.
      • Deleted PoolConnection::release() which was previously deprecated in favor of PoolConnection::detach().
      • Fixed connections getting leaked even when calling .close().
    • [[#1748]]: Derive PgHasArrayType for #[sqlx(transparent)] types [[@carols10cents]]

    Added

    • [#1843]: Expose some useful methods on PgValueRef [[@mfreeborn]]
    • [#1889]: SQLx-CLI: add --connect-timeout [[@abonander]]
      • Adds a default 10 second connection timeout to all commands.
    • [#1890]: Added test for mssql LoginAck [[@walf443]]
    • [#1891]: Added test for mssql ProtocolInfo [[@walf443]]
    • [#1892]: Added test for mssql ReturnValue [[@walf443]]
    • [#1895]: Add support for i16 to Any driver [[@EthanYuan]]
    • [#1897]: Expose ConnectOptions and PoolOptions on Pool and database name on PgConnectOptions [[@Nukesor]]

    Changed

    • [#1782]: Reuse a cached DB connection instead of always opening a new one for sqlx-macros [[@LovecraftianHorror]]
    • [#1807]: Bump remaining dependencies [[@paolobarbolini]]
    • [#1808]: Update to edition 2021 [[@paolobarbolini]]
      • Note that while SQLx does not officially track an MSRV and only officially supports the latest stable Rust, this effectively places a lower bound of 1.56.0 on the range of versions it may work with.
    • [#1823]: (sqlx-macros) Ignore deps when getting metadata for workspace root [[@LovecraftianHorror]]
    • [#1831]: Update crc to 3.0 [[@djc]]
    • [#1887]: query_as: don't stop stream after decoding error [[@lovasoa]]

    Fixed

    • [#1814]: SQLx-cli README: move Usage to the same level as Install [[@tobymurray]]
    • [#1815]: SQLx-cli README: reword "building in offline mode" [[@tobymurray]]
    • [#1818]: Trim [] from host string before passing to TcpStream [[@smonv]]
      • This fixes handling of database URLs with IPv6 hosts.
    • [#1842]: Fix usage of serde_json in macros [[@mfreeborn]]
    • [#1855]: Postgres: fix panics on unknown type OID when decoding [[@demurgos]]
    • [#1856]: MySQL: support COLLATE_UTF8MB4_0900_AI_CI [[@scottwey]]
      • Fixes the MySQL driver thinking text columns are bytestring columns when querying against a Planetscale DB.
    • [#1861]: MySQL: avoid panic when streaming packets are empty [[@e-rhodes]]
    • [#1863]: Fix nullability check for inner joins in Postgres [[@OskarPersson]]
    • [#1881]: Fix field is never read warnings on Postgres test [[@walf443]]
    • [#1882]: Fix unused result must be used warnings [[@walf443]]
    • [#1888]: Fix migration checksum comparison during sqlx migrate info [[@mdtusz]]
    • [#1894]: Fix typos [[@kianmeng]]
    Open source →
  22. 0.5.13 15 Apr 2022
    Release notes

    This is a hotfix that reverts [#1748] as that was an accidental breaking change:
    the generated PgHasArrayType impl conflicts with manual impls of the trait.
    This change will have to wait for 0.6.0.

    Open source →
  23. 0.5.12 14 Apr 2022 withdrawn
    Release notes

    27 pull requests were merged this release cycle.

    Added

    • [#1641]: Postgres: Convenient wrapper for advisory locks [[@abonander]]
    • [#1675]: Add function to undo migrations [[@jdrouet]]
    • [#1722]: Postgres: implement PgHasArrayType for serde_json::{Value, RawValue} [[@abreis]]
    • [#1736]: Derive Clone for MySqlArguments and MssqlArguments [[@0xdeafbeef]]
    • [#1748]: Derive PgHasArrayType for #[sqlx(transparent)] types [[@carols10cents]]
    • [#1754]: Include affected rows alongside returned rows in query logging [[@david-mcgillicuddy-moixa]]
    • [#1757]: Implement Type for Cow<str> for MySQL, MSSQL and SQLite [[@ipetkov]]
    • [#1769]: sqlx-cli: add --source to migration subcommands [[@pedromfedricci]]
    • [#1774]: Postgres: make extra_float_digits settable [[@abonander]]
      • Can be set to None for Postgres or third-party database servers that don't support the option.
    • [#1776]: Implement close-event notification for Pool [[@abonander]]
      • Also fixes PgListener preventing Pool::close() from resolving.
    • [#1780]: Implement query builder [[@crajcan]]
      • See also [#1790]: Document and expand query builder [[@abonander]]
    • [#1781]: Postgres: support NUMERIC[] using decimal feature [[@tm-drtina]]
    • [#1784]: SQLite: add FromStr, Copy, PartialEq, Eq impls for options enums [[@andrewwhitehead]]

    Changed

    • [#1625]: Update RustCrypto crates [[@paolobarbolini]]
    • [#1725]: Update heck to 0.4 [[@paolobarbolini]]
    • [#1738]: Update regex [[@Dylan-DPC]]
    • [#1763]: SQLite: update libsqlite3-sys [[@espindola]]

    Fixed

    • [#1719]: Fix a link in query!() docs [[@vbmade2000]]
    • [#1731]: Postgres: fix option passing logic [[@liushuyu]]
    • [#1735]: sqlx-cli: pass DATABASE_URL to command spawned in prepare [[@LovecraftianHorror]]
    • [#1741]: Postgres: fix typo in TSTZRANGE [[@mgrachev]]
    • [#1761]: Fix link from QueryAs to query_as() in docs [[@mgrachev]]
    • [#1786]: MySQL: silence compile warnings for unused fields [[@andrewwhitehead]]
    • [#1789]: SQLite: fix left-joins breaking query!() macros [[@tyrelr]]
    • [#1791]: Postgres: fix newline parsing of .pgpass files [[@SebastienGllmt]]
    • [#1799]: PoolConnection: don't leak connection permit if drop task fails to run [[@abonander]]
    Open source →
  24. 0.5.11 18 Feb 2022
    Release notes

    20 pull requests were merged this release cycle.

    Added

    • [#1610]: Allow converting AnyConnectOptions to a specific ConnectOptions [[@05storm26]]
    • [#1652]: Implement From for AnyConnection [[@genusistimelord]]
    • [#1658]: Handle SQLITE_LOCKED [[@madadam]]
    • [#1665]: Document offline mode usage with feature flags [[@sedrik]]
    • [#1680]: Show checksum mismatches in sqlx migrate info [[@ifn3]]
    • [#1685]: Add tip for setting opt-level for sqlx-macros [[@LovecraftianHorror]]
    • [#1687]: Docs: Acquire examples and alternative [[@stoically]]
    • [#1696]: Postgres: support for ltree [[@cemoktra]]
    • [#1710]: Postgres: support for lquery [[@cemoktra]]

    Changed

    • [#1605]: Remove unused dependencies [[@paolobarbolini]]
    • [#1606]: Add target context to Postgres NOTICE logs [[@dbeckwith]]
    • [#1684]: Macros: Cache parsed sqlx-data.json instead of reparsing [[@LovecraftianHorror]]

    Fixed

    • [#1608]: Drop worker shared state in shutdown (SQLite) [[@andrewwhitehead]]
    • [#1619]: Docs(macros): remove sentences banning usage of as _ [[@k-jun]]
    • [#1626]: Simplify cargo-sqlx command-line definition [[@tranzystorek-io]]
    • [#1636]: Fix and extend Postgres transaction example [[@taladar]]
    • [#1657]: Fix typo in macro docs [[@p9s]]
    • [#1661]: Fix binding Option<T> for Any driver [[@ArGGu]]
    • [#1667]: MySQL: Avoid panicking if packet is empty [[@nappa85]]
    • [#1692]: Postgres: Fix power calculation when encoding BigDecimal into NUMERIC [[@VersBinarii]]

    Additionally, we have introduced two mitigations for the issue of the cyclic dependency on ahash:

    • We re-downgraded our version requirement on indexmap from 1.7.0 back to 1.6.2 so users can pin it to that version as recommended in aHash#95.
    • Thanks to the work of [@LovecraftianHorror] in #1684, we no longer require the preserve_order feature of serde_json which gives users another place to break the cycle by simply not enabling that feature.
      • This may introduce extra churn in Git diffs for sqlx-data.json, however. If this is an issue for you but the dependency cycle isn't, you can re-enable the preserve_order feature:
      [dependencies]
      serde_json = { version = "1", features = ["preserve_order"] }
      
    Open source →
  25. 0.5.10 30 Dec 2021
    Release notes

    A whopping 31 pull requests were merged this release cycle!

    According to this changelog, we saw 18 new contributors! However, some of these folks may have missed getting mentioned in previous entries since we only listed highlights. To avoid anyone feeling left out, I put in the effort this time and tried to list every single one here.

    Added

    • [#1228]: Add Pool::any_kind() [[@nitnelave]]
    • [#1343]: Add Encode/Decode impl for Cow<'_, str> [[@Drevoed]]
    • [#1474]: Derive Clone, Copy for AnyKind [[@yuyawk]]
    • [#1497]: Update FAQ to explain how to configure docs.rs to build a project using SQLx [[@russweas]]
    • [#1498]: Add description of migration file structure to migrate!() docs [[@zbigniewzolnierowicz]]
    • [#1508]: Add .persistent(bool) to QueryAs, QueryScalar [[@akiradeveloper]]
    • [#1514]: Add support for serialized threading mode to SQLite [[@LLBlumire]]
    • [#1523]: Allow rust_decimal::Decimal in PgRange [[@meh]]
    • [#1539]: Support PGOPTIONS and adding custom configuration options in PgConnectOptions [[@liushuyu]]
    • [#1562]: Re-export either::Either used by Executor::fetch_many() [[@DoumanAsh]]
    • [#1584]: Add feature to use RusTLS instead of native-tls for sqlx-cli [[@SonicZentropy]]
    • [#1592]: Add AnyConnection::kind() [[@05storm26]]

    Changes

    • [#1385]: Rewrite Postgres array handling to reduce boilerplate and allow custom types [[@jplatte]]
    • [#1479]: Remove outdated mention of runtime-async-std-native-tls as the default runtime in README.md [[@yerke]]
    • [#1526]: Revise Pool docs in a couple places [[@abonander]]
    • [#1535]: Bump libsqlite-sys to 0.23.1 [[@nitsky]]
    • [#1551]: SQLite: make worker thread responsible for all FFI calls [[@abonander]]
      • If you were encountering segfaults with the SQLite driver, there's a good chance this will fix it!
    • [#1557]: CI: test with Postgres 14 [[@paolobarbolini]]
    • [#1571]: Make whoami dep optional, only pull it in for Postgres [[@joshtriplett]]
    • [#1572]: Update rsa crate to 0.5 [[@paolobarbolini]]
    • [#1591]: List SeaORM as an ORM option in the README [[@kunjee17]]
    • [#1601]: Update itoa and dirs [[@paolobarbolini]]

    Fixes

    • [#1475]: Fix panic when converting a negative chrono::Duration to PgInterval [[@yuyawk]]
    • [#1483]: Fix error when decoding array of custom types from Postgres [[@demurgos]
    • [#1501]: Reduce indexmap version requirement to 1.6.2 [[@dimfeld]]
    • [#1511]: Fix element type given to Postgres for arrays of custom enums [[@chesedo]]
    • [#1517]: Fix mismatched type errors in MySQL type tests [[@abonander]]
    • [#1537]: Fix missing re-export of PgCopyIn [[@akiradeveloper]]
    • [#1566]: Match ~/.pgpass password after URL parsing and fix user and database ordering [[@D1plo1d]]
    • [#1582]: cargo sqlx prepare: Append to existing RUSTFLAGS instead of overwriting [[@tkintscher]]
    • [#1587]: SQLite: if set, send PRAGMA key on a new connection before anything else. [[@parazyd]]
      • This should fix problems with being unable to open databases using SQLCipher.
    Open source →
  26. 0.5.9 01 Oct 2021
    Release notes

    A hotfix release to address the issue of the sqlx crate itself still depending on older versions of sqlx-core and sqlx-macros.

    No other changes from 0.5.8.

    Open source →
  27. 0.5.8 01 Oct 2021 withdrawn
    Release notes

    A total of 24 pull requests were merged this release cycle! Some highlights:

    • [#1289] Support the immutable option on SQLite connections [[@djmarcin]]
    • [#1295] Support custom initial options for SQLite [[@ghassmo]]
      • Allows specifying custom PRAGMAs and overriding those set by SQLx.
    • [#1345] Initial support for Postgres COPY FROM/TO[[@montanalow], [@abonander]]
    • [#1439] Handle multiple waiting results correctly in MySQL [[@eagletmt]]
    Open source →
  28. 0.5.7 21 Aug 2021
    Release notes
    • [#1392] use resolve_path when getting path for include_str!() [[@abonander]]
      • Fixes a regression introduced by [[#1332]].
    • [#1393] avoid recursively spawning tasks in PgListener::drop() [[@abonander]]
      • Fixes a panic that occurs when PgListener is dropped in async fn main().
    Open source →
  29. 0.5.6 17 Aug 2021
    Release notes

    A large bugfix release, including but not limited to:

    • [#1329] Implement MACADDR type for Postgres [[@nomick]]
    • [#1363] Fix PortalSuspended for array of composite types in Postgres [[@AtkinsChang]]
    • [#1320] Reimplement sqlx::Pool internals using futures-intrusive [[@abonander]]
      • This addresses a number of deadlocks/stalls on acquiring connections from the pool.
    • [#1332] Macros: tell the compiler about external files/env vars to watch [[@abonander]]
      • Includes sqlx build-script to create a build.rs to watch migrations/ for changes.
      • Nightly users can try RUSTFLAGS=--cfg sqlx_macros_unstable to tell the compiler to watch migrations/ for changes instead of using a build script.
      • See the new section in the docs for sqlx::migrate!() for details.
    • [#1351] Fix a few sources of segfaults/errors in SQLite driver [[@abonander]]
      • Includes contributions from [[@link2ext]] and [[@madadam]].
    • [#1323] Keep track of column typing in SQLite EXPLAIN parsing [[@marshoepial]]
      • This fixes errors in the macros when using INSERT/UPDATE/DELETE ... RETURNING ... in SQLite.

    A total of 25 pull requests were merged this release cycle!

    Open source →
  30. 0.5.5 24 May 2021
    Release notes
    • [#1242] Fix infinite loop at compile time when using query macros [[@toshokan]]
    Open source →
  31. 0.5.4 22 May 2021 withdrawn
    Release notes
    • [#1235] Fix compilation with rustls from an eager update to webpki [[@ETCaton]]
    Open source →
  32. 0.5.3 22 May 2021
    Release notes
    • [#1211] Even more tweaks and fixes to the Pool internals [[@abonander]]

    • [#1213] Add support for bytes and chrono::NaiveDateTime to Any [[@guylapid]]

    • [#1224] Add support for chrono::DateTime<Local> to Any with MySQL [[@NatPRoach]]

    • [#1216] Skip empty lines and comments in pgpass files [[@feikesteenbergen]]

    • [#1218] Add support for PgMoney to the compile-time type-checking [[@iamsiddhant05]]

    Open source →
  33. 0.5.2 16 Apr 2021
    Release notes
    • [#1149] Tweak and optimize Pool internals [[@abonander]]

    • [#1132] Remove 'static bound on Connection::transaction [[@argv-minus-one]]

    • [#1128] Fix -y flag for sqlx db reset -y [[@qqwa]]

    • [#1099] [#1097] Truncate buffer when BufStream is dropped [[@Diggsey]]

    PostgreSQL

    • [#1170] Remove Self: Type bounds in Encode / Decode implementations for arrays [[@jplatte]]

      Enables working around the lack of support for user-defined array types:

      #[derive(sqlx::Encode)]
      struct Foos<'a>(&'a [Foo]);
      
      impl sqlx::Type<sqlx::Postgres> for Foos<'_> {
          fn type_info() -> PgTypeInfo {
              PgTypeInfo::with_name("_foo")
          }
      }
      
      query_as!(
          Whatever,
          "<QUERY with $1 of type foo[]>",
          Foos(&foo_vec) as _,
      )
      
    • [#1141] Use u16::MAX instead of i16::MAX for a check against the largest number of parameters in a query [[@crajcan]]

    • [#1112] Add support for DOMAIN types [[@demurgos]]

    • [#1100] Explicitly UNLISTEN before returning connections to the pool in PgListener [[@Diggsey]]

    SQLite

    • [#1161] Catch SQLITE_MISUSE on connection close and panic [[@link2xt]]

    • [#1160] Do not cast pointers to i32 (cast to usize) [[@link2xt]]

    • [#1156] Reset the statement when fetch_many stream is dropped [[@link2xt]]

    Open source →
  34. 0.5.1 04 Feb 2021
    Release notes
    • Update sqlx-rt to 0.3.
    Open source →
  35. 0.5.0 04 Feb 2021 withdrawn
    Release notes

    Changes

    • [#983] [#1022] Upgrade async runtime dependencies [[@seryl], [@ant32], [@jplatte], [@robjtede]]

      • tokio 1.0
      • actix-rt 2.0
    • [[#854]] Allow chaining map and try_map [[@jplatte]]

      Additionally enables calling these combinators with the macros:

      let ones: Vec<i32> = query!("SELECT 1 as foo")
          .map(|row| row.foo)
          .fetch_all(&mut conn).await?;
      
    • [#940] Rename the #[sqlx(rename)] attribute used to specify the type name on the database side to #[sqlx(type_name)] [[@jplatte]].

    • [#976] Rename the DbDone types to DbQueryResult. [[@jplatte]]

    • [#976] Remove the Done trait. The .rows_affected() method is now available as an inherent method on PgQueryResult, MySqlQueryResult and so on. [[@jplatte]]

    • [#1007] Remove any::AnyType (and replace with directly implementing Type<Any>) [[@jplatte]]

    Added

    • [#998] [#821] Add .constraint() to DatabaseError [[@fl9]]

    • [#919] For SQLite, add support for unsigned integers [[@dignifiedquire]]

    Fixes

    • [#1002] For SQLite, GROUP BY in query! caused an infinite loop at compile time. [[@pymongo]]

    • [#979] For MySQL, fix support for non-default authentication. [[@sile]]

    • [#918] Recover from dropping wait_for_conn inside Pool. [[@antialize]]

    Open source →
  36. 0.4.2 19 Dec 2020
    Release notes
    • [#908] Fix whoami crash on FreeBSD platform [[@fundon]] [[@AldaronLau]]

    • [#895] Decrement pool size when connection is released [[@andrewwhitehead]]

    • [#878] Fix conn.transaction wrapper [[@hamza1311]]

      conn.transaction(|transaction: &mut Transaction<Database> | {
          // ...
      });
      
    • [#874] Recognize 1 as true for `SQLX_OFFLINE [[@Pleto]]

    • [#747] [#867] Replace lru-cache with hashlink [[@chertov]]

    • [#860] Add rename_all to FromRow and add camelCase and PascalCase [[@framp]]

    • [#839] Add (optional) support for bstr::BStr, bstr::BString, and git2::Oid [[@joshtriplett]]

    SQLite

    • [#893] Fix memory leak if create_collation fails [[@slumber]]

    • [#852] Fix potential 100% CPU usage in fetch_one / fetch_optional [[@markazmierczak]]

    • [#850] Add synchronous option to SqliteConnectOptions [[@markazmierczak]]

    PostgreSQL

    • [#889] Fix decimals (one more time) [[@slumber]]

    • [#876] Add support for BYTEA[] to compile-time type-checking [[@augustocdias]]

    • [#845] Fix path for &[NaiveTime] in query! macros [[@msrd0]]

    MySQL

    • [#880] Consider utf8mb4_general_ci as a string [[@mcronce]]
    Open source →
  37. 0.4.0 12 Nov 2020
    Release notes
    • [#774] Fix usage of SQLx derives with other derive crates [[@NyxCode]]

    • [#762] Fix migrate!() (with no params) [[@esemeniuc]]

    • [#755] Add kebab-case to rename_all [[@iamsiddhant05]]

    • [#735] Support rustls [[@jplatte]]

      Adds -native-tls or -rustls on each runtime feature:

      # previous
      features = [ "runtime-async-std" ]
      
      # now
      features = [ "runtime-async-std-native-tls" ]
      
    • [#718] Support tuple structs with #[derive(FromRow)] [[@dvermd]]

    SQLite

    • [#789] Support $NNN parameters [[@nitsky]]

    • [#784] Use futures_channel::oneshot in worker for big perf win [[@markazmierczak]]

    PostgreSQL

    • [#781] Fix decimal conversions handling of 0.01 [[@pimeys]]

    • [#745] Always prefer parsing of the non-localized notice severity field [[@dstoeckel]]

    • [#742] Enable Vec<DateTime<Utc>> with chrono [[@mrcd]]

    MySQL

    • [#743] Consider utf8mb4_bin as a string [[@digorithm]]

    • [#739] Fix minor protocol detail with iteration-count that was blocking Vitess [[@mcronce]]

    Open source →
  38. 0.4.0-beta.1 27 Jul 2020 pre-release
    Release notes

    Highlights

    • Enable compile-time type checking from cached metadata to enable building in an environment without access to a development database (e.g., Docker, CI).

    • Initial support for Microsoft SQL Server. If there is something missing that you need, open an issue. We are happy to help.

    • SQL migrations, both with a CLI tool and programmatically loading migrations at runtime.

    • Runtime-determined database driver, Any, to support compile-once and run with a database driver selected at runtime.

    • Support for user-defined types and more generally overriding the inferred Rust type from SQL with compile-time SQL verification.

    Fixed

    MySQL

    • [#418] Support zero dates and times [[@blackwolf12333]]

    Added

    • [#174] Inroduce a builder to construct connections to bypass the URL parsing

      // MSSQL
      let conn = MssqlConnectOptions::new()
          .host("localhost")
          .database("master")
          .username("sa")
          .password("Password")
          .connect().await?;
      
      // SQLite
      let conn = SqliteConnectOptions::from_str("sqlite://a.db")?
          .foreign_keys(false)
          .connect().await?;
      
    • [#127] Get the last ID or Row ID inserted for MySQL or SQLite

      // MySQL
      let id: u64 = query!("INSERT INTO table ( col ) VALUES ( ? )", val)
          .execute(&mut conn).await?
          .last_insert_id(); // LAST_INSERT_ID()
      
      // SQLite
      let id: i64 = query!("INSERT INTO table ( col ) VALUES ( ?1 )", val)
          .execute(&mut conn).await?
          .last_insert_rowid(); // sqlite3_last_insert_rowid()
      
    • [#263] Add hooks to the Pool: after_connect, before_release, and after_acquire

      // PostgreSQL
      let pool = PgPoolOptions::new()
          .after_connect(|conn| Box::pin(async move {
              conn.execute("SET application_name = 'your_app';").await?;
              conn.execute("SET search_path = 'my_schema';").await?;
      
              Ok(())
          }))
          .connect("postgres:// …").await?
      
    • [#308] [#495] Extend derive(FromRow) with support for #[sqlx(default)] on fields to allow reading in a partial query [[@OriolMunoz]]

    • [#454] [[#456]] Support rust_decimal::Decimal as an alternative to bigdecimal::BigDecimal for NUMERIC columns in MySQL and PostgreSQL [[@pimeys]]

    • [#181] Column names and type information is now accessible from Row via Row::columns() or Row::column(name)

    PostgreSQL

    • [#197] [#271] Add initial support for INTERVAL (full support pending a time::Period type) [[@dimtion]]

    MySQL

    • [#449] [[#450]] Support Unix Domain Sockets (UDS) for MySQL [[@pimeys]]

    SQLite

    • Types are now inferred for expressions. This means its now possible to use query! and query_as! for:

      let row = query!("SELECT 10 as _1, x + 5 as _2 FROM table").fetch_one(&mut conn).await?;
      
      assert_eq!(row._1, 10);
      assert_eq!(row._2, 5); // 5 + x?
      
    • [#167] Support foreign_keys explicitly with a foreign_keys(true) method available on SqliteConnectOptions which is a builder for new SQLite connections (and can be passed into PoolOptions to build a pool).

      let conn = SqliteConnectOptions::new()
          .foreign_keys(true) // on by default
          .connect().await?;
      
    • [#430] [#438] Add method to get the raw SQLite connection handle [[@agentsim]]

      // conn is `SqliteConnection`
      // this is not unsafe, but what you do with the handle will be
      let ptr: *mut libsqlite3::sqlite3 = conn.as_raw_handle();
      
    • [#164] Support TIMESTAMP, DATETIME, DATE, and TIME via chrono in SQLite [[@felipesere]] [[@meteficha]]

    Changed

    • Transaction now mutably borrows a connection instead of owning it. This enables a new (or nested) transaction to be started from &mut conn.

    • [#145] [#444] Use a least-recently-used (LRU) cache to limit the growth of the prepared statement cache for SQLite, MySQL, and PostgreSQL [[@pimeys]]

    SQLite

    • [#499] INTEGER now resolves to i64 instead of i32, INT4 will still resolve to i32

    Removed

    Open source →
  39. 0.3.5 06 May 2020
    Release notes

    Fixed

    • [#259] Handle percent-encoded paths for SQLite [[@g-s-k]]

    • [#281] Deallocate SQLite statements before closing the SQLite connection [[@hasali19]]

    • [#284] Fix handling of 0 for BigDecimal in PostgreSQL and MySQL [[@abonander]]

    Added

    • [#256] Add query_unchecked! and query_file_unchecked! with similar semantics to query_as_unchecked! [[@meh]]

    • [#252] [#297] Derive several traits for the Json<T> wrapper type [[@meh]]

    • [#261] Add support for #[sqlx(rename_all = "snake_case")] to #[derive(Type)] [[@shssoichiro]]

    • [#253] Add support for UNIX domain sockets to PostgreSQL [[@Nilix007]]

    • [#251] Add support for textual JSON on MySQL [[@blackwolf12333]]

    • [#275] [#268] Optionally log formatted SQL queries on execution [[@shssoichiro]]

    • [#267] Support Cargo.toml relative .env files; allows for each crate in a workspace to use their own .env file and thus their own DATABASE_URL [[@xyzd]]

    Open source →
  40. 0.3.4 10 Apr 2020
    Release notes

    Fixed

    • [#241] Type name for custom enum is not always attached to TypeInfo in PostgreSQL

    • [#237] [#238] User-defined type name matching is now case-insensitive in PostgreSQL [[@qtbeee]]

    • [#231] Handle empty queries (and those with comments) in SQLite

    • [#228] Provide MapRow implementations for functions (enables .map(|row| ...) over .try_map(|row| ...))

    Added

    • [#234] Add support for NUMERIC in MySQL with the bigdecimal crate [[@xiaopengli89]]

    • [#227] Support #[sqlx(rename = "new_name")] on struct fields within a FromRow derive [[@sidred]]

    Open source →
  41. 0.3.3 02 Apr 2020
    Release notes

    Fixed

    • [#214] Handle percent-encoded usernames in a database URL [[@jamwaffles]]

    Changed

    • [#216] Mark Cursor, Query, QueryAs, query::Map, and Transaction as #[must_use] [[@Ace4896]]

    • [#213] Remove matches dependency and use matches macro from std [[@nrjais]]

    Open source →
  42. 0.3.2 31 Mar 2020
    Release notes

    Fixed

    • [#212] Removed sneaky println! in MySqlCursor
    Open source →
  43. 0.3.1 31 Mar 2020
    Release notes

    Fixed

    • [#203] Allow an empty password for MySQL

    • [#204] Regression in error reporting for invalid SQL statements on PostgreSQL

    • [#200] Fixes the incorrect handling of raw (r#...) fields of a struct in the FromRow derive [[@sidred]]

    Open source →
  44. 0.3.0 29 Mar 2020
    Release notes

    Breaking Changes

    • sqlx::Row now has a lifetime ('c) tied to the database connection. In effect, this means that you cannot store Rows or collect them into a collection. Query (returned from sqlx::query()) has map() which takes a function to map from the Row to another type to make this transition easier.

      In 0.2.x

      let rows = sqlx::query("SELECT 1")
          .fetch_all(&mut conn).await?;
      

      In 0.3.x

      let values: Vec<i32> = sqlx::query("SELECT 1")
          .map(|row: PgRow| row.get(0))
          .fetch_all(&mut conn).await?;
      

      To assist with the above, sqlx::query_as() now supports querying directly into tuples (up to 9 elements) or struct types with a #[derive(FromRow)].

      // This extension trait is needed until a rust bug is fixed
      use sqlx::postgres::PgQueryAs;
      
      let values: Vec<(i32, bool)> = sqlx::query_as("SELECT 1, false")
          .fetch_all(&mut conn).await?;
      
    • HasSqlType<T>: Database is now T: Type<Database> to mirror Encode and Decode

    • Query::fetch (returned from query()) now returns a new Cursor type. Cursor is a Stream-like type where the item type borrows into the stream (which itself borrows from connection). This means that using query().fetch() you can now stream directly from the database with zero-copy and zero-allocation.

    • Remove PgTypeInfo::with_oid and replace with PgTypeInfo::with_name

    Added

    • Results from the database are now zero-copy and no allocation beyond a shared read buffer for the TCP stream ( in other words, almost no per-query allocation ). Bind arguments still do allocate a buffer per query.

    • [#129] Add support for SQLite. Generated code should be very close to normal use of the C API.

      • Adds Sqlite, SqliteConnection, SqlitePool, and other supporting types
    • [#97] [#134] Add support for user-defined types. [[@Freax13]]

      • Rust-only domain types or transparent wrappers around SQL types. These may be used transparently inplace of the SQL type.

        #[derive(sqlx::Type)]
        #[repr(transparent)]
        struct Meters(i32);
        
      • Enumerations may be defined in Rust and can match SQL by integer discriminant or variant name.

        #[derive(sqlx::Type)]
        #[repr(i32)] // Expects a INT in SQL
        enum Color { Red = 1, Green = 2, Blue = 3 }
        
        #[derive(sqlx::Type)]
        #[sqlx(rename = "TEXT")] // May also be the name of a user defined enum type
        #[sqlx(rename_all = "lowercase")] // similar to serde rename_all
        enum Color { Red, Green, Blue } // expects 'red', 'green', or 'blue'
        
      • Postgres further supports user-defined composite types.

        #[derive(sqlx::Type)]
        #[sqlx(rename = "interface_type")]
        struct InterfaceType {
            name: String,
            supplier_id: i32,
            price: f64
        }
        
    • [#98] [#131] Add support for asynchronous notifications in Postgres (LISTEN / NOTIFY). [[@thedodd]]

      • Supports automatic reconnection on connection failure.

      • PgListener implements Executor and may be used to execute queries. Be careful however as if the intent is to handle and process messages rapidly you don't want to be tying up the connection for too long. Messages received during queries are buffered and will be delivered on the next call to recv().

      let mut listener = PgListener::new(DATABASE_URL).await?;
      
      listener.listen("topic").await?;
      
      loop {
          let message = listener.recv().await?;
      
          println!("payload = {}", message.payload);
      }
      
    • Add unchecked variants of the query macros. These will still verify the SQL for syntactic and semantic correctness with the current database but they will not check the input or output types.

      This is intended as a temporary solution until query_as! is able to support user defined types.

      • query_as_unchecked!
      • query_file_as_unchecked!
    • Add support for many more types in Postgres

      • JSON, JSONB [[@oeb25]]
      • INET, CIDR [[@PoiScript]]
      • Arrays [[@oeb25]]
      • Composites ( Rust tuples or structs with a #[derive(Type)] )
      • NUMERIC [[@abonander]]
      • OID (u32)
      • "CHAR" (i8)
      • TIMESTAMP, TIMESTAMPTZ, etc. with the time crate [[@utter-step]]
      • Enumerations ( Rust enums with a #[derive(Type)] ) [[@Freax13]]

    Changed

    • Query (and QueryAs; returned from query(), query_as(), query!(), and query_as!()) now will accept both &mut Connection or &Pool where as in 0.2.x they required &mut &Pool.

    • Executor now takes any value that implements Execute as a query. Execute is implemented for Query and QueryAs to mean exactly what they've meant so far, a prepared SQL query. However, Execute is also implemented for just &str which now performs a raw or unprepared SQL query. You can further use this to fetch Rows from the database though it is not as efficient as the prepared API (notably Postgres and MySQL send data back in TEXT mode as opposed to in BINARY mode).

      use sqlx::Executor;
      
      // Set the time zone parameter
      conn.execute("SET TIME ZONE LOCAL;").await
      
      // Demonstrate two queries at once with the raw API
      let mut cursor = conn.fetch("SELECT 1; SELECT 2");
      let row = cursor.next().await?.unwrap();
      let value: i32 = row.get(0); // 1
      let row = cursor.next().await?.unwrap();
      let value: i32 = row.get(0); // 2
      

    Removed

    • Query (returned from query()) no longer has fetch_one, fetch_optional, or fetch_all. You must map the row using map() and then you will have a query::Map value that has the former methods available.

      let values: Vec<i32> = sqlx::query("SELECT 1")
          .map(|row: PgRow| row.get(0))
          .fetch_all(&mut conn).await?;
      

    Fixed

    • [#62] [#130] [#135] Remove explicit set of IntervalStyle. Allow usage of SQLx for CockroachDB and potentially PgBouncer. [[@bmisiak]]

    • [#108] Allow nullable and borrowed values to be used as arguments in query! and query_as!. For example, where the column would resolve to String in Rust (TEXT, VARCHAR, etc.), you may now use Option<String>, Option<&str>, or &str instead. [[@abonander]]

    • [#108] Make unknown type errors far more informative. As an example, trying to SELECT a DATE column will now try and tell you about the chrono feature. [[@abonander]]

      optional feature `chrono` required for type DATE of column #1 ("now")
      
    Open source →
  45. 0.3.0-alpha.2 25 Mar 2020 pre-release

    Nothing published for this version

  46. 0.3.0-alpha.1 19 Mar 2020 pre-release

    Nothing published for this version

  47. 0.2.5 10 Mar 2020
    Release notes

    Fixed

    • Fix decoding of Rows containing NULLs in Postgres #104

    • After a large review and some battle testing by @ianthetechie of the Pool, a live leaking issue was found. This has now been fixed by [@abonander] in #84 which included refactoring to make the pool internals less brittle (using RAII instead of manual work is one example) and to help any future contributors when changing the pool internals.

    • Passwords are now being percent-decoded before being presented to the server [[@repnop]]

    • [@100] Fix FLOAT and DOUBLE decoding in MySQL

    Added

    • [#72] Add PgTypeInfo::with_oid to allow simple construction of PgTypeInfo which enables HasSqlType to be implemented by downstream consumers of SQLx [[@jplatte]]

    • [#96] Add support for returning columns from query! with a name of a rust keyword by using raw identifiers [[@yaahc]]

    • [#71] Implement derives for Encode and Decode. This is the first step to supporting custom types in SQLx. [[@Freax13]]

    Open source →
  48. 0.2.4 01 Feb 2020
    Release notes

    Fixed

    • Fix decoding of Rows containing NULLs in MySQL (and add an integration test so this doesn't break again)
    Open source →
  49. 0.2.3 18 Jan 2020
    Release notes

    Fixed

    • Fix query! when used on a query that does not return results
    Open source →
  50. 0.2.2 17 Jan 2020
    Release notes

    Added

    • [#57] Add support for unsigned integers and binary types in query! for MySQL [[@mehcode]]

    Fixed

    • Fix stall when requesting TLS from a Postgres server that explicitly does not support TLS (such as postgres running inside docker) [[@abonander]]

    • [#66] Declare used features for tokio in sqlx-macros explicitly

    Open source →
  51. 0.2.1 16 Jan 2020
    Release notes

    Fixed

    • [#64, #65] Fix decoding of Rows containing NULLs in MySQL [[@danielakhterov]]
    • [#55] Use a shared tokio runtime for the query! macro compile-time execution (under the runtime-tokio feature) [[@udoprog]]
    Open source →
  52. 0.2.0 15 Jan 2020
    Release notes

    Fixed

    • https://github.com/launchbadge/sqlx/issues/47

    Added

    • Support Tokio through an optional runtime-tokio feature.

    • Support SQL transactions. You may now use the begin() function on Pool or Connection to start a new SQL transaction. This returns sqlx::Transaction which will ROLLBACK on Drop or can be explicitly COMMIT using commit().

    • Support TLS connections.

    Open source →
  53. 0.1.1 28 Dec 2019

    Nothing published for this version

  54. 0.0.0 27 Nov 2019

    Nothing published for this version

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive