mirror of
https://github.com/launchbadge/sqlx.git
synced 2025-10-03 07:45:30 +00:00
Update CHANGELOG
This commit is contained in:
parent
db66163c9e
commit
0c5dfef22e
96
CHANGELOG.md
96
CHANGELOG.md
@ -7,6 +7,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## 0.3.0 - UNRELEASED
|
## 0.3.0 - UNRELEASED
|
||||||
|
|
||||||
|
### Breaking Changes
|
||||||
|
|
||||||
|
- `sqlx::Row` now has a lifetime (`'c`) tied to the database connection. In effect, this means that you cannot store `Row`s 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
|
||||||
|
|
||||||
|
```rust
|
||||||
|
let rows = sqlx::query("SELECT 1")
|
||||||
|
.fetch_all(&mut conn).await?;
|
||||||
|
```
|
||||||
|
|
||||||
|
In 0.3.x
|
||||||
|
|
||||||
|
```rust
|
||||||
|
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)]`.
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// 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
|
### Added
|
||||||
|
|
||||||
- Results from the database are now zero-copy and no allocation beyond a shared read buffer
|
- Results from the database are now zero-copy and no allocation beyond a shared read buffer
|
||||||
@ -38,7 +78,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
```rust
|
```rust
|
||||||
#[derive(sqlx::Type)]
|
#[derive(sqlx::Type)]
|
||||||
#[sqlx(postgres(oid = 25))] // Postgres requires the OID
|
#[sqlx(rename = "TEXT")] // May also be the name of a user defined enum type
|
||||||
#[sqlx(rename_all = "lowercase")] // similar to serde rename_all
|
#[sqlx(rename_all = "lowercase")] // similar to serde rename_all
|
||||||
enum Color { Red, Green, Blue } // expects 'red', 'green', or 'blue'
|
enum Color { Red, Green, Blue } // expects 'red', 'green', or 'blue'
|
||||||
```
|
```
|
||||||
@ -47,7 +87,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
```rust
|
```rust
|
||||||
#[derive(sqlx::Type)]
|
#[derive(sqlx::Type)]
|
||||||
#[sqlx(postgres(oid = ?))] // Postgres requires the OID
|
#[sqlx(rename = "interface_type")]
|
||||||
struct InterfaceType {
|
struct InterfaceType {
|
||||||
name: String,
|
name: String,
|
||||||
supplier_id: i32,
|
supplier_id: i32,
|
||||||
@ -75,6 +115,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
println!("payload = {}", message.payload);
|
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
|
### Changed
|
||||||
|
|
||||||
@ -100,38 +160,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
let value: i32 = row.get(0); // 2
|
let value: i32 = row.get(0); // 2
|
||||||
```
|
```
|
||||||
|
|
||||||
- `sqlx::Row` now has a lifetime (`'c`) tied to the database connection. In effect, this means that you cannot store `Row`s 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
|
|
||||||
|
|
||||||
```rust
|
|
||||||
let rows = sqlx::query("SELECT 1")
|
|
||||||
.fetch_all(&mut conn).await?;
|
|
||||||
```
|
|
||||||
|
|
||||||
In 0.3.x
|
|
||||||
|
|
||||||
```rust
|
|
||||||
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).
|
|
||||||
|
|
||||||
```rust
|
|
||||||
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**.
|
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
- `Query` (returned from `query()`) no longer has `fetch_one`, `fetch_optional`, or `fetch_all`. You _must_ map the row using `map()` and then
|
- `Query` (returned from `query()`) no longer has `fetch_one`, `fetch_optional`, or `fetch_all`. You _must_ map the row using `map()` and then
|
||||||
|
Loading…
x
Reference in New Issue
Block a user