Skip to content

Latest commit

 

History

History
2027 lines (1512 loc) · 73.5 KB

File metadata and controls

2027 lines (1512 loc) · 73.5 KB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

1.0.0 - pending

New features

  • #![forbid(unsafe_code)] in all workspace crates SeaQL#930
  • Unify Expr and SimpleExpr as one type. SimpleExpr is kept as an alias of Expr, but they can now be used interchangably. There may be a few compile errors and some clippy warnings, basically just remove the redundant .into() SeaQL#889
pub type SimpleExpr = Expr; // !
impl From<Expr> for SimpleExpr { .. } // now removed
  • New Iden type system. Previously, DynIden is an alias to SeaRc<dyn Iden>, and is lazily rendered. Now, it's an Cow<'static, str>, and is eagerly rendered. SeaRc is no longer an alias to Rc / Arc, now is only a unit struct. As such, Send / Sync is no longer needed. It's still possible to dynamically serialize a String as identifier, see example usage. SeaQL#909
pub type DynIden = SeaRc<dyn Iden>;               // old
pub struct DynIden(pub(crate) Cow<'static, str>); // new

pub struct SeaRc<I>(pub(crate) RcOrArc<I>);       // old
pub struct SeaRc;                                 // new
  • Reworked TableRef and ColumnRef variants SeaQL#927
// the following variants are collapsed into one:
enum TableRef {
    Table(DynIden),
    SchemaTable(DynIden, DynIden),
    DatabaseSchemaTable(DynIden, DynIden, DynIden),
    TableAlias(DynIden, DynIden),
    SchemaTableAlias(DynIden, DynIden, DynIden),
    DatabaseSchemaTableAlias(DynIden, DynIden, DynIden, DynIden),
    ..
}
// now it's just:
enum TableRef {
    Table(TableName, Option<DynIden>), // optional Alias
    ..
}

pub struct DatabaseName(pub DynIden);
pub struct SchemaName(pub Option<DatabaseName>, pub DynIden);
/// A table name, potentially qualified as [database.][schema.]table
pub struct TableName(pub Option<SchemaName>, pub DynIden);
// before
enum ColumnRef {
    Column(DynIden),
    TableColumn(DynIden, DynIden),
    SchemaTableColumn(DynIden, DynIden, DynIden),
    Asterisk,
    TableAsterisk(DynIden),
}
// now
enum ColumnRef {
    /// A column name, potentially qualified as [database.][schema.][table.]column
    Column(ColumnName),
    /// An `*` expression, potentially qualified as [database.][schema.][table.]*
    Asterisk(Option<TableName>),
}

pub struct ColumnName(pub Option<TableName>, pub DynIden);

Enhancements

  • Add Expr::not_exists SeaQL#983
  • Add serde feature. Currently, enabling it allows Value to be serializable SeaQL#966
  • Add Keyword::Default SeaQL#965
  • Enable clippy::nursery SeaQL#938
  • Removed unnecessary 'static bounds from type signatures SeaQL#921
  • cast_as_quoted now allows you to qualify the type name. SeaQL#922
let query = Query::select()
    .expr(Func::cast_as_quoted("hello", ("MySchema", "MyType")))
    .to_owned();

assert_eq!(
    query.to_string(PostgresQueryBuilder),
    r#"SELECT CAST('hello' AS "MySchema"."MyType")"#
);
  • Most Value variants are now unboxed (except BigDecimal and Array). Previously the size is 24 bytes. SeaQL#925
assert_eq!(std::mem::size_of::<Value>(), 32);
  • Merged Func/Function and PgFunc/PgFunction. Now the latter is just an alias of the former SeaQL#944
// old
condition.add(Func::lower(Expr::col(column)).eq(SimpleExpr::FunctionCall(Func::lower(value))))
// new
condition.add(Func::lower(Expr::col(*column)).eq(Func::lower(value)));
  • impl From<Expr> for Condition. Now you can use Expr instead of ConditionExpression, which has been removed from the public API SeaQL#915
Cond::all().add(ConditionExpression::Expr(Expr::new(..))) // old
Cond::all().add(Expr::new(..))                            // new
  • Replaced serial with GENERATED BY DEFAULT AS IDENTITY (Postgres) SeaQL#918
let table = Table::create()
    .table(Char::Table)
    .col(ColumnDef::new(Char::Id).integer().not_null().auto_increment().primary_key())
    .to_owned();

assert_eq!(
    table.to_string(PostgresQueryBuilder),
    [
        r#"CREATE TABLE "character" ("#,
            r#""id" integer GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY,"#,
        r#")"#,
    ].join(" ")
);

// if you needed to support legacy system you can still do:
let table = Table::create()
    .table(Char::Table)
    .col(ColumnDef::new(Char::Id).custom("serial").not_null().primary_key())
    .to_owned();

assert_eq!(
    table.to_string(PostgresQueryBuilder),
    [
        r#"CREATE TABLE "character" ("#,
            r#""id" serial NOT NULL PRIMARY KEY"#,
        r#")"#,
    ].join(" ")
);

Breaking Changes

  • Removed inherent SimpleExpr methods that duplicate ExprTrait. If you encounter the following error, please add use sea_query::ExprTrait in scope SeaQL#890
error[E0599]: no method named `like` found for enum `sea_query::Expr` in the current scope
    |
    |         Expr::col((self.entity_name(), *self)).like(s)
    |
    |     fn like<L>(self, like: L) -> Expr
    |        ---- the method is available for `sea_query::Expr` here
    |
    = help: items from traits can only be used if the trait is in scope
help: trait `ExprTrait` which provides `like` is implemented but not in scope; perhaps you want to import it
    |
 -> + use sea_query::ExprTrait;
error[E0308]: mismatched types
  --> src/sqlite/discovery.rs:27:57
   |
   |             .and_where(Expr::col(Alias::new("type")).eq("table"))
   |                                                      -- ^^^^^^^ expected `&Expr`, found `&str`
   |                                                      |
   |                                                      arguments to this method are incorrect
   |
   = note: expected reference `&sea_query::Expr`
              found reference `&'static str`
  • Added non_exhaustive to AST enums. It allows us to add new features and extend the AST without breaking the API. If you encounter the following error, please add a wildcard match _ => {..} SeaQL#891
error[E0004]: non-exhaustive patterns: `&_` not covered
    |
    |     match table_ref {
    |           ^^^^^^^^^ pattern `&_` not covered
    |
note: `TableRef` defined here
    |
    | pub enum TableRef {
    | ^^^^^^^^^^^^^^^^^
    = note: the matched value is of type `&TableRef`
    = note: `TableRef` is marked as non-exhaustive, so a wildcard `_` is necessary to match exhaustively
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
    | TableRef::FunctionCall(_, tbl) => SeaRc::clone(tbl),
 -> | &_ => todo!(),
  • ExprTrait::eq collided with std::cmp::Eq. If you encounter the following error, please use std::cmp::PartialEq::eq(a, b) or sea_query::ExprTrait::eq(a, b) explicitly SeaQL#890
error[E0308]: mismatched types
    |
    |     fn eq(&self, other: &Self) -> bool {
    |                                   ---- expected `bool` because of return type
    |         format!("{:?}", self.0).eq(&format!("{:?}", other.0))
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `Expr`

For more information about this error, try `rustc --explain E0308`.
error: could not compile `seaography` (lib) due to 1 previous error
  • The method signature of Iden::unquoted is changed. If you're implementing Iden manually, you can modify it like below SeaQL#909
error[E0050]: method `unquoted` has 2 parameters but the declaration in trait `types::Iden::unquoted` has 1
  --> src/tests_cfg.rs:31:17
   |
   |     fn unquoted(&self, s: &mut dyn std::fmt::Write) {
   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected 1 parameter, found 2
   |
  ::: src/types.rs:63:17
   |
   |     fn unquoted(&self) -> &str;
   |                 ----- trait requires 1 parameter
impl Iden for Glyph {
  - fn unquoted(&self, s: &mut dyn fmt::Write) {
  + fn unquoted(&self) -> &str {
  -     write!(
  -         s,
  -         "{}",
            match self {
                Self::Table => "glyph",
                Self::Id => "id",
                Self::Tokens => "tokens",
            }
  -     )
  -     .unwrap();
    }
}
  • Removed ConditionExpression from the public API. Instead, just convert between Condition and Expr using From/Into SeaQL#915
error[E0603]: enum `ConditionExpression` is private
   --> tests/mysql/query.rs:734:20
    |
 >  |     use sea_query::ConditionExpression;
    |                    ^^^^^^^^^^^^^^^^^^^ private enum
 >  |     Cond::all().add(ConditionExpression::Expr(Expr::new(
    |                     ^^^^^^^^^^^^^^^^^^^ use of undeclared type `ConditionExpression`

Simply do the following:

Cond::all().add(Expr::new(..))
  • Reworked ColumnRef variants may cause compile error.
error[E0277]: the trait bound `fn(std::option::Option<TableName>) -> sea_query::ColumnRef {sea_query::ColumnRef::Asterisk}: IntoColumnRef` is not satisfied
    --> src/executor/query.rs:1599:21
    |
 >  |             .column(ColumnRef::Asterisk)
    |              ------ ^^^^^^^^^^^^^^^^^^^ the trait `sea_query::Iden` is not implemented for fn item `fn(std::option::Option<TableName>) -> sea_query::ColumnRef {sea_query::ColumnRef::Asterisk}`
    |              |
    |              required by a bound introduced by this call

error[E0308]: mismatched types
    --> src/executor/query.rs:1607:54
    |
 >  |                 SimpleExpr::Column(ColumnRef::Column("id".into_iden()))
    |                                    ----------------- ^^^^^^^^^^^^^^^^ expected `ColumnName`, found `DynIden`
    |                                    |
    |                                    arguments to this enum variant are incorrect

In the former case Asterisk has an additional inner Option<TableName>, you can simply put None.

.column(ColumnRef::Asterisk(None))

In the latter case, &'static str can now be used in most methods that accepts ColumnRef.

Expr::column("id")
  • Reworked TableRef variants may cause compile error.
error[E0061]: this enum variant takes 2 arguments but 1 argument was supplied
   --> src/entity/relation.rs:526:15
    |
 >  |     from_tbl: TableRef::Table("foo".into_iden()),
    |               ^^^^^^^^^^^^^^^-------------------
    |                              ||
    |                              |expected `TableName`, found `DynIden`
    |                              argument #2 of type `Option<DynIden>` is missing

It's recommended to use the IntoTableRef trait to convert types instead of constructing AST manually.

use sea_orm::sea_query::IntoTableRef;

from_tbl: "foo".into_table_ref(),
  • Replace dyn <Trait> with impl <Trait> SeaQL#982 This gained us up to 10% performance, however it does mean dyn QueryBuilder is no longer possible.

Minor breaking changes

  • Changed Into* traits (like IntoCondition) to be defined as trait IntoCondition: Into<Condition> and implemented for all T: Into<Condition>. Now IntoCondition and Into<Condition> are completely interchangable. But you can still use .into_condition() for readability.

    If you have manually implemented Into* traits, it may cause conflicts. You should rewrite your impls as as impl From<..> for Condition.

    Full list of changed traits:

  • Unboxed Value variants may cause compile error. Simply remove the Box in these cases SeaQL#925

error[E0308]: mismatched types
   --> /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/sea-schema-0.17.0-rc.3/src/sqlite/def/table.rs:248:59
    |
 >  | Value::String(Some(Box::new(string_value.to_string()))));
    |               ---- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `String`, found `Box<String>`
    |               |
    |               arguments to this enum variant are incorrect
  • Blanket-implemented SqliteExpr and PgExpr for T where T: ExprTrait SeaQL#914

    Now you can use database-specific operators with all expression types. If you had custom implementations in your own code, some may no longer compile and may need to be deleted.

  • Replaced ColumnSpec::Check(Expr) with ColumnSpec::Check(Check) to support named check constraints SeaQL#920

  • SelectStatement::cross_join no longer accepts a condition SeaQL#956

  • Turned TypeRef from an enum into a struct that reuses TableName. SeaQL#969

  • Changed Expr::TypeName(DynIden) to Expr::TypeName(TypeRef), which can be qualified.

    If you manually construct this variant and it no longer compiles, just add .into().

  • Renamed QueryBuilder::prepare_simple_expr to prepare_expr SeaQL#988

  • Changed signature of Expr::Custom SeaQL#940

enum Expr {
  - Custom(String),
  + Custom(Cow<'static, str>),
}

fn cust<T>(s: T) -> Self
where
  - T: Into<String>,
  + T: Into<Cow<'static, str>>,
{
    Self::Custom(s.into())
}

You many encounter the following error:

    |         let sql = self.sql.trim();
    |                   ^^^^^^^^ borrowed value does not live long enough
...
    |             Expr::cust_with_values(sql, values.0)
    |             ------------------------------------- argument requires that `self.stmt.sql` is borrowed for `'static`

Simply convert the &str to String:

let sql = self.sql.trim().to_owned();

Bug Fixes

  • Removed invalid condition requirement on SelectStatement::cross_join SeaQL#956

Upgrades

Maintainence

  • sea-query-binder has been superseded with sea-query-sqlx

0.32.7 - 2025-08-06

Enhancements

  • Added ValueType::is_option

Bug Fixes

  • Fix incorrect casting of ChronoDateTimeWithTimeZone in Value::Array SeaQL#933
  • Add missing parenthesis to WINDOW clause SeaQL#919
SELECT .. OVER "w" FROM "character" WINDOW "w" AS (PARTITION BY "ww")
  • Fix serializing iden as a value in ALTER TYPE ... RENAME TO ... statements SeaQL#924
ALTER TYPE "font" RENAME TO "typeface"
  • Fixed the issue where milliseconds were truncated when formatting Value::Constant SeaQL#929
'2025-01-01 00:00:00.000000'
                    ^^^^^^^

0.32.6 - 2025-05-27

Enhancements

  • impl From<Condition> and From<ConditionExpression> for SimpleExpr SeaQL#886

0.32.5 - 2025-05-07

New features

  • Support for creating functional indexes in Postgres and MySQL SeaQL#869

Enhancements

  • Make RcOrArc a documented type alias instead of a direct reexport SeaQL#875
  • Impl Iden for &'static str (don't wrap strings in Alias::new) SeaQL#882

0.32.4 - 2025-04-17

New Features

  • Added support for temporary tables SeaQL#878
let statement = Table::create()
    .table(Font::Table)
    .temporary()
    .col(
        ColumnDef::new(Font::Id)
            .integer()
            .not_null()
            .primary_key()
            .auto_increment()
    )
    .col(ColumnDef::new(Font::Name).string().not_null())
    .take();

assert_eq!(
    statement.to_string(MysqlQueryBuilder),
    [
        "CREATE TEMPORARY TABLE `font` (",
        "`id` int NOT NULL PRIMARY KEY AUTO_INCREMENT,",
        "`name` varchar(255) NOT NULL",
        ")",
    ]
    .join(" ")
);
  • Added Value::dummy_value
use sea_query::Value;
let v = Value::Int(None);
let n = v.dummy_value();
assert_eq!(n, Value::Int(Some(0)));

Bug Fixes

  • Quote type properly in AsEnum casting SeaQL#880
let query = Query::select()
    .expr(Expr::col(Char::FontSize).as_enum(TextArray))
    .from(Char::Table)
    .to_owned();

assert_eq!(
    query.to_string(PostgresQueryBuilder),
    r#"SELECT CAST("font_size" AS "text"[]) FROM "character""#
);

0.32.3 - 2025-03-16

New Features

let query = Query::update()
    .table(Glyph::Table)
    .value(Glyph::Tokens, Expr::column((Char::Table, Char::Character)))
    .from(Char::Table)
    .cond_where(
        Expr::col((Glyph::Table, Glyph::Image))
            .eq(Expr::col((Char::Table, Char::UserData))),
    )
    .to_owned();

assert_eq!(
    query.to_string(PostgresQueryBuilder),
    r#"UPDATE "glyph" SET "tokens" = "character"."character" FROM "character" WHERE "glyph"."image" = "character"."user_data""#
);
assert_eq!(
    query.to_string(SqliteQueryBuilder),
    r#"UPDATE "glyph" SET "tokens" = "character"."character" FROM "character" WHERE "glyph"."image" = "character"."user_data""#
);
use sea_query::extension::postgres::PostgresSelectStatementExt;

let query = Query::select()
    .columns([Glyph::Image])
    .from(Glyph::Table)
    .table_sample(SampleMethod::SYSTEM, 50.0, None)
    .to_owned();

assert_eq!(
    query.to_string(PostgresQueryBuilder),
    r#"SELECT "image" FROM "glyph" TABLESAMPLE SYSTEM (50)"#
);
  • Support ALTER COLUMN USING .. (Postgres) SeaQL#848
let table = Table::alter()
    .table(Char::Table)
    .modify_column(
        ColumnDef::new(Char::Id)
            .integer()
            .using(Expr::col(Char::Id).cast_as(Alias::new("integer"))),
    )
    .to_owned();

assert_eq!(
    table.to_string(PostgresQueryBuilder),
    [
        r#"ALTER TABLE "character""#,
        r#"ALTER COLUMN "id" TYPE integer USING CAST("id" AS integer)"#,
    ]
    .join(" ")
);

House Keeping

  • Updated ordered-float to 4
  • Updated thiserror to 2

0.32.2 - 2025-02-18

New Features

  • Added with_cte to use WITH clauses in all statements SeaQL#859
let select = SelectStatement::new()
    .columns([Glyph::Id, Glyph::Image, Glyph::Aspect])
    .from(Glyph::Table)
    .to_owned();
let cte = CommonTableExpression::new()
    .query(select)
    .table_name(Alias::new("cte"))
    .to_owned();
let select = SelectStatement::new()
    .columns([Glyph::Id, Glyph::Image, Glyph::Aspect])
    .from(Alias::new("cte"))
    .with_cte(cte)
    .to_owned();
assert_eq!(
    select.to_string(PostgresQueryBuilder),
    [
        r#"WITH "cte" AS"#,
        r#"(SELECT "id", "image", "aspect""#,
        r#"FROM "glyph")"#,
        r#"SELECT "id", "image", "aspect" FROM "cte""#,
    ]
    .join(" ")
);

Enhancements

Bug Fixes

  • Write empty Postgres array as '{}' SeaQL#854

0.32.1 - 2024-12-01

New Features

  • Added Value::as_null
let v = Value::Int(Some(2));
let n = v.as_null();

assert_eq!(n, Value::Int(None));
  • Added bitwise and/or operators (bit_and, bit_or) SeaQL#841
let query = Query::select()
    .expr(1.bit_and(2).eq(3))
    .to_owned();

assert_eq!(
    query.to_string(PostgresQueryBuilder),
    r#"SELECT (1 & 2) = 3"#
);

Enhancements

  • Added GREATEST & LEAST function SeaQL#844
  • Added ValueType::enum_type_name() SeaQL#836
  • Removed "one common table" restriction on recursive CTE SeaQL#835

House keeping

0.32.0 - 2024-10-17

Releases

2024-08-09

  • sea-query/0.32.0-rc.1
  • sea-query-binder/0.7.0-rc.1
  • sea-query-binder/0.7.0-rc.2
  • sea-query-rusqlite/0.7.0-rc.1
  • sea-query-postgres/0.5.0-rc.1

2024-10-05

  • sea-query/0.32.0-rc.2
  • sea-query-attr/0.1.3
  • sea-query-derive/0.4.2
  • sea-query-rusqlite/0.7.0-rc.2

New Features

  • Construct Postgres query with vector extension SeaQL#774
    • Added postgres-vector feature flag
    • Added Value::Vector, ColumnType::Vector, ColumnDef::vector(), PgBinOper::EuclideanDistance, PgBinOper::NegativeInnerProduct and PgBinOper::CosineDistance
    assert_eq!(
        Query::select()
            .columns([Char::Character])
            .from(Char::Table)
            .and_where(
                Expr::col(Char::Character).eq(Expr::val(pgvector::Vector::from(vec![1.0, 2.0])))
            )
            .to_string(PostgresQueryBuilder),
        r#"SELECT "character" FROM "character" WHERE "character" = '[1,2]'"#
    );
  • Added ExprTrait to unify Expr and SimpleExpr methods SeaQL#791
  • Support partial index CREATE INDEX .. WHERE .. SeaQL#478

Enhancements

  • Replace Educe with manual implementations SeaQL#817

sea-query-derive

  • Merged #[enum_def] into sea-query-derive
  • #[enum_def] now impl additional IdenStatic and AsRef<str> SeaQL#769

sea-query-attr

  • Updated syn, heck and darling
  • sea-query-attr is now deprecated

Upgrades

0.31.1 - 2024-10-05

Enhancements

  • Derive Eq, Ord, Hash for Alias SeaQL#818
  • Added Func::md5 function SeaQL#786
  • Added Postgres Json functions JSON_BUILD_OBJECT and JSON_AGG SeaQL#787
  • Added Postgres function ARRAY_AGG SeaQL#846
  • Added Func::cast_as_quoted SeaQL#789
  • Added IF NOT EXISTS to ALTER TYPE ADD VALUE SeaQL#803

0.31.0 - 2024-08-02

Versions

  • sea-query/0.31.0-rc.1: 2024-01-31
  • sea-query/0.31.0-rc.4: 2024-02-02
  • sea-query/0.31.0-rc.5: 2024-04-14
  • sea-query/0.31.0-rc.6: 2024-05-03
  • sea-query/0.31.0-rc.7: 2024-06-02
  • sea-query/0.31.0-rc.8: 2024-06-19
  • sea-query-binder/0.6.0-rc.1: 2024-01-31
  • sea-query-binder/0.6.0-rc.2: 2024-04-14
  • sea-query-binder/0.6.0-rc.3: 2024-06-19
  • sea-query-binder/0.6.0-rc.4: 2024-06-25
  • sea-query-binder/0.6.0: 2024-08-02
  • sea-query-rusqlite/0.6.0-rc.1: 2024-02-19
  • sea-query-rusqlite/0.6.0: 2024-08-02
  • sea-query-attr/0.1.2: 2024-04-14
  • sea-query-diesel/0.2.0: 2024-08-02

New Features

Breaking Changes

assert_eq!(
    Table::create()
        .table(Alias::new("strange"))
        .col(ColumnDef::new(Alias::new("id")).integer().not_null().auto_increment().primary_key())
        .col(ColumnDef::new(Alias::new("int1")).integer())
        .col(ColumnDef::new(Alias::new("int2")).tiny_integer())
        .col(ColumnDef::new(Alias::new("int3")).small_integer())
        .col(ColumnDef::new(Alias::new("int4")).big_integer())
        .col(ColumnDef::new(Alias::new("string1")).string())
        .col(ColumnDef::new(Alias::new("string2")).string_len(24))
        .col(ColumnDef::new(Alias::new("char1")).char())
        .col(ColumnDef::new(Alias::new("char2")).char_len(24))
        .col(ColumnDef::new(Alias::new("text_col")).text())
        .col(ColumnDef::new(Alias::new("json_col")).json())
        .col(ColumnDef::new(Alias::new("uuid_col")).uuid())
        .col(ColumnDef::new(Alias::new("decimal1")).decimal())
        .col(ColumnDef::new(Alias::new("decimal2")).decimal_len(12, 4))
        .col(ColumnDef::new(Alias::new("money1")).money())
        .col(ColumnDef::new(Alias::new("money2")).money_len(12, 4))
        .col(ColumnDef::new(Alias::new("float_col")).float())
        .col(ColumnDef::new(Alias::new("double_col")).double())
        .col(ColumnDef::new(Alias::new("date_col")).date())
        .col(ColumnDef::new(Alias::new("time_col")).time())
        .col(ColumnDef::new(Alias::new("datetime_col")).date_time())
        .col(ColumnDef::new(Alias::new("boolean_col")).boolean())
        .col(ColumnDef::new(Alias::new("binary2")).binary_len(1024))
        .col(ColumnDef::new(Alias::new("binary3")).var_binary(1024))
        .col(ColumnDef::new(Alias::new("binary4")).blob())
        .to_string(SqliteQueryBuilder),
    [
        r#"CREATE TABLE "strange" ( "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,"#,
            r#""int1" integer,"#,
            r#""int2" tinyint,"#,
            r#""int3" smallint,"#,
            r#""int4" bigint,"#,
            r#""string1" varchar,"#,
            r#""string2" varchar(24),"#,
            r#""char1" char,"#,
            r#""char2" char(24),"#,
            r#""text_col" text,"#,
            r#""json_col" json_text,"#,
            r#""uuid_col" uuid_text,"#,
            r#""decimal1" real,"#,
            r#""decimal2" real(12, 4),"#,
            r#""money1" real_money,"#,
            r#""money2" real_money(12, 4),"#,
            r#""float_col" float,"#,
            r#""double_col" double,"#,
            r#""date_col" date_text,"#,
            r#""time_col" time_text,"#,
            r#""datetime_col" datetime_text,"#,
            r#""boolean_col" boolean,"#,
            r#""binary2" blob(1024),"#,
            r#""binary3" varbinary_blob(1024),"#,
            r#""binary4" blob"#,
        r#")"#,
    ]
    .join(" ")
);
  • MySQL money type maps to decimal
  • MySQL blob types moved to sea_query::extension::mysql::MySqlType; ColumnDef::blob() now takes no parameters
assert_eq!(
    Table::create()
        .table(BinaryType::Table)
        .col(ColumnDef::new(BinaryType::BinaryLen).binary_len(32))
        .col(ColumnDef::new(BinaryType::Binary).binary())
        .col(ColumnDef::new(BinaryType::Blob).blob())
        .col(ColumnDef::new(BinaryType::TinyBlob).custom(MySqlType::TinyBlob))
        .col(ColumnDef::new(BinaryType::MediumBlob).custom(MySqlType::MediumBlob))
        .col(ColumnDef::new(BinaryType::LongBlob).custom(MySqlType::LongBlob))
        .to_string(MysqlQueryBuilder),
    [
        "CREATE TABLE `binary_type` (",
            "`binlen` binary(32),",
            "`bin` binary(1),",
            "`b` blob,",
            "`tb` tinyblob,",
            "`mb` mediumblob,",
            "`lb` longblob",
        ")",
    ]
    .join(" ")
);
  • ColumnDef::binary() set column type as binary with default length of 1
  • Removed BlobSize enum
  • Added StringLen to represent length of var-char/binary
/// Length for var-char/binary; default to 255
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum StringLen {
    /// String size
    N(u32),
    Max,
    #[default]
    None,
}
  • ValueType::columntype() of Vec<u8> maps to VarBinary(StringLen::None)
  • ValueType::columntype() of String maps to String(StringLen::None)
  • ColumnType::Bit maps to bit for Postgres
  • ColumnType::Binary and ColumnType::VarBinary map to bytea for Postgres
  • Value::Decimal and Value::BigDecimal bind as real for SQLite
  • ColumnType::Year(Option<MySqlYear>) changed to ColumnType::Year

Enhancements

  • Added IntoColumnDef trait, allowing &mut ColumnDef / ColumnDef as argument
  • Added ColumnType::string() and ColumnType::var_binary() as shim for old API
  • Added ON DUPLICATE KEY DO NOTHING polyfill for MySQL SeaQL#765
  • Added non-TLS runtime SeaQL#783

House keeping

  • Added ColumnType mapping documentation
  • Replace derivative with educe SeaQL#763

Upgrades

0.30.8 - Pending

Enhancements

  • Added InsertStatement::values_from_panic SeaQL#739

0.30.7 - 2024-01-12

Enhancements

House keeping

  • Slight refactors and documentation update

0.30.6 - 2024-01-01

House keeping

sea-query-rusqlite 0.5.0 - 2023-12-29

0.30.5 - 2023-12-14

New Features

  • Added feature flag option-more-parentheses to have more parentheses in expressions SeaQL#723
  • Added feature flag option-sqlite-exact-column-type to only use integer for SQLite
  • Support COUNT(DISTINCT "column") SeaQL#700
  • Support index hints for MySQL (via extension::mysql::MySqlSelectStatementExt) SeaQL#636
  • Support expressions for ON CONFLICT targets SeaQL#692

Enhancements

  • Add from_clear to allow emptying current from tables in select statement SeaQL#716

Breaking Changes

  • Caution: do not use the --all-features param in Cargo. If you want to enable all features, use the all-features feature flag instead.

0.30.4 - 2023-12-01

Enhancements

  • Impl QueryStatementWriter as inherent methods for WithQuery

0.30.3 - 2023-11-22

New Features

Bug Fixes

  • Fixed BIGINT PRIMARY KEY AUTOINCREMENT for SQLite SeaQL#689

Upgrades

  • Upgrade chrono to 0.4.27

Breaking changes

sea-query-derive 0.4.1 - 2023-10-19

  • Upgrade syn to 2

0.30.2 - 2023-09-23

Bug Fixes

  • Fixed incorrect behavior when adding an autoincrement column for Postgres SeaQL#697

Enhancements

  • Make ValueTuple hashable

0.30.1 - 2023-08-25

Versions

New Features

  • Added Func::round and Func::round_with_precision SeaQL#671

Enhancements

  • Added some getters to FunctionCall SeaQL#677

Bug Fixes

  • Fixed bytea literal syntax for Postgres SeaQL#666
  • Fixed issues with semantics of parenthesis removal SeaQL#675
  • Fixed behaviour in FunctionCall when calling arg multiple times SeaQL#687

Breaking changes

  • As part of SeaQL#687, calling FunctionCall::arg multiple times will append the arguments instead of replacing old values

0.30.0 - 2023-07-20

This is a small (but major) upgrade, the only changes are:

Versions

Notes

sea-query 0.29 has a number of breaking changes, so it might be easier for you to first upgrade to 0.29, then upgrade sqlx by bumping to 0.30.

0.29.1 - 2023-07-12

Versions

New Features

  • Added ValueTuple::Many for tuple with length up to 12 SeaQL#564
  • Added CREATE TABLE CHECK constraints SeaQL#567
  • Added support generated column spec SeaQL#581
  • Added BIT_AND, BIT_OR functions SeaQL#582
  • Added implementation SqlxBinder, RusqliteBinder and PostgresBinder for WithQuery SeaQL#580
  • Added new type Asteriks SeaQL#596
  • Added IF NOT EXISTS for DROP INDEX in Postgres and Sqlite SeaQL#610
  • Added -> and ->> operators for Postgres SeaQL#617
  • Added TableCreateStatement::set_extra and TableCreateStatement::get_extra SeaQL#611
  • Added TableCreateStatement::comment and ColumnDef::comment for MySQL comments SeaQL#622
  • Added PgExpr::get_json_field and PgExpr::cast_json_field methods for constructing Postgres JSON expressions SeaQL#630
  • Added PgBinOper::Regex and PgBinOper::RegexCaseInsensitive for Postgres Regex operators
  • Added BinOper::Custom for defining custom binary operators
  • Added GLOB operator for Sqlite SeaQL#651
  • Added CREATE or DROP EXTENSION statements for Postgres SeaQL#616
  • Added a feature flag hashable-value, which will impl Hash for Value; when enabled, Value::Float(NaN) == Value::Float(NaN) would be true SeaQL#598
  • Added PgBinOper::Overlap for Postgres operators SeaQL#653

Enhancements

  • Implemented PartialEq for DynIden, SimpleExpr and related types SeaQL#620

Breaking changes

  • Removed variants Four, Five, Six from enum ValueTuple as part of SeaQL#564
  • Removed Expr::tbl, Expr::greater_than, Expr::greater_or_equal, Expr::less_than, Expr::less_or_equal, Expr::into_simple_expr SeaQL#551
  • Removed SimpleExpr::equals and SimpleExpr::not_equals SeaQL#551
  • Removed InsertStatement::exprs, InsertStatement::exprs_panic SeaQL#551
  • Removed OnConflict::update_value, OnConflict::update_values, OnConflict::update_expr, OnConflict::update_exprs SeaQL#551
  • Removed UpdateStatement::exprs, UpdateStatement::col_expr, UpdateStatement::value_expr SeaQL#551
  • BigInteger now maps to bigint instead of integer on SQLite SeaQL#556
  • Table::truncate now panic for Sqlite SeaQL#590
  • Deprecated Expr::asteriks and Expr::table_asteriks SeaQL#596
  • Expr::cust, Expr::cust_with_values, Expr::cust_with_expr, Expr::cust_with_exprs, TableForeignKey::name, ForeignKeyCreateStatement::name, ForeignKeyDropStatement::name, TableIndex::name, IndexCreateStatement::name, IndexDropStatement::name, SqlWriterValues::new, ColumnType::custom, TableCreateStatement::engine, TableCreateStatement::collate, TableCreateStatement::character_set, TableRef::new, LikeExpr::str now accept T: Into<String> SeaQL#594
  • OnConflict::values and OnConflict::update_columns will append the new values keeping the old values intact instead of erasing them SeaQL#609
  • As part of SeaQL#620, SeaRc now becomes a wrapper type. If you used SeaRc for something other than dyn Iden, you now have to use RcOrArc. However be reminded that it is not an intended use of the API anyway.
// new definition
struct SeaRc<I>(RcOrArc<I>);
// remains unchanged
type DynIden = SeaRc<dyn Iden>;

// if you did:
let _: DynIden = Rc::new(Alias::new("char"));
// replace with:
let _: DynIden = SeaRc::new(Alias::new("char"));
  • Added new type Quote and changed the Iden trait:
struct Quote(pub(crate) u8, pub(crate) u8);

trait Iden {
    // then:
    fn prepare(&self, s: &mut dyn fmt::Write, q: char);
    // now:
    fn prepare(&self, s: &mut dyn fmt::Write, q: Quote);

    // then:
    fn quoted(&self, q: char) -> String;
    // now:
    fn quoted(&self, q: Quote) -> String;
}

House keeping

  • Elided unnecessary lifetimes SeaQL#552
  • Changed all version = "^x.y.z" into version = "x.y.z" in all Cargo.toml SeaQL#547
  • Disabled default features and enable only the needed ones SeaQL#547
  • tests_cfg module is available only if you enabled tests-cfg feature SeaQL#584
  • Removed hard coded quotes SeaQL#613
  • Enabled required syn v1 features SeaQL#624
  • Fix macro hygiene (any! / all!) SeaQL#639 SeaQL#640

Bug fixes

  • ALTER TABLE now panic if has multiple column for Sqlite SeaQL#595
  • Fixed alter primary key column statements for Postgres SeaQL#646

0.28.5 - 2023-05-11

  • Added implementation SqlxBinder, RusqliteBinder and PostgresBinder for WithQuery SeaQL#580
    • sea-query-binder 0.3.1
    • sea-query-postgres 0.2.1
    • sea-query-rusqlite 0.2.1

0.28.4 - 2023-04-11

Bug fixes

  • Fix quoted string bug while inserting array of strings to Postgres SeaQL#576
  • Added comma if multiple names are passed to TypeDropStatement SeaQL#623

0.28.3 - 2023-01-18

Enhancements

  • Added getter for the UpdateStatement::values field SeaQL#578
  • Implements PartialEq for ColumnType SeaQL#579
  • Added helper function to construct ColumnType::Custom SeaQL#579

0.28.2 - 2023-01-04

Enhancements

  • Added Cow<str> conversion to Value SeaQL#550
  • Added convert various UUID defined in uuid::fmt module into sea_query::Value::Uuid SeaQL#563

0.28.1 - 2022-12-29

Bug fixes

0.28.0 - 2022-12-09

New Features

  • New struct FunctionCall which hold function and arguments SeaQL#475
  • New trait IdenStatic with method fn as_str(&self) -> &'static str SeaQL#508
  • New traits PgExpr and SqliteExpr for custom expressions SeaQL#519
  • Support BigDecimal, IpNetwork and MacAddress for sea-query-postgres SeaQL#503

API Additions

  • Added SelectStatement::from_function SeaQL#475
  • Added binary operators from the Postgres pg_trgm extension SeaQL#486
  • Added ILIKE and NOT ILIKE operators SeaQL#473
  • Added the mul and div methods for SimpleExpr SeaQL#510
  • Added the MATCH, -> and ->> operators for SQLite SeaQL#513
  • Added the FULL OUTER JOIN SeaQL#497
  • Added PgFunc::get_random_uuid SeaQL#530
  • Added SimpleExpr::eq, SimpleExpr::ne, Expr::not_equals SeaQL#528
  • Added PgFunc::starts_with SeaQL#529
  • Added Expr::custom_keyword and SimpleExpr::not SeaQL#535
  • Added SimpleExpr::like, SimpleExpr::not_like and Expr::cast_as SeaQL#539
  • Added support for NULLS NOT DISTINCT clause for Postgres SeaQL#532
  • Added Expr::cust_with_expr and Expr::cust_with_exprs SeaQL#531
  • Added support for converting &String to Value SeaQL#537

Enhancements

  • Made value::with_array module public and therefore making NotU8 trait public SeaQL#511
  • Drop the Sized requirement on implementers of SchemaBuilders SeaQL#524

Bug fixes

// given
let (statement, values) = sea_query::Query::select()
    .column(Glyph::Id)
    .from(Glyph::Table)
    .cond_where(Cond::any()
        .add(Cond::all()) // empty all() => TRUE
        .add(Cond::any()) // empty any() => FALSE
    )
    .build(sea_query::MysqlQueryBuilder);

// old behavior
assert_eq!(statement, r#"SELECT `id` FROM `glyph`"#);

// new behavior
assert_eq!(
    statement,
    r#"SELECT `id` FROM `glyph` WHERE (TRUE) OR (FALSE)"#
);

Breaking changes

  • MSRV is up to 1.62 SeaQL#535
  • ColumnType::Array definition changed from Array(SeaRc<Box<ColumnType>>) to Array(SeaRc<ColumnType>) SeaQL#492
  • Func::* now returns FunctionCall instead of SimpleExpr SeaQL#475
  • Func::coalesce now accepts IntoIterator<Item = SimpleExpr> instead of IntoIterator<Item = Into<SimpleExpr> SeaQL#475
  • Removed Expr::arg and Expr::args - these functions are no longer needed SeaQL#475
  • Moved all Postgres specific operators to PgBinOper SeaQL#507
  • Expr::value, Expr::gt, Expr::gte, Expr::lt, Expr::lte, Expr::add, Expr::div, Expr::sub, Expr::modulo, Expr::left_shift, Expr::right_shift, Expr::between, Expr::not_between, Expr::is, Expr::is_not, Expr::if_null now accepts Into<SimpleExpr> instead of Into<Value> SeaQL#476
  • Expr::is_in, Expr::is_not_in now accepts Into<SimpleExpr> instead of Into<Value> and convert it to SimpleExpr::Tuple instead of SimpleExpr::Values SeaQL#476
  • Expr::expr now accepts Into<SimpleExpr> instead of SimpleExpr SeaQL#475
  • Moved Expr::ilike, Expr::not_ilike, Expr::matches, Expr::contains, Expr::contained, Expr::concatenate, Expr::concat, SimpleExpr::concatenate and SimpleExpr::concat to new trait PgExpr SeaQL#519
  • Expr::equals now accepts C: IntoColumnRef instead of T: IntoIden, C: IntoIden SeaQL#528
  • Removed integer and date time column types' display length / precision option SeaQL#525

Deprecations

  • Deprecated Expr::greater_than, Expr::greater_or_equal, Expr::less_than and Expr::less_or_equal SeaQL#476
  • Deprecated SimpleExpr::equals, SimpleExpr::not_equals SeaQL#528
  • Deprecated Expr::tbl, please use Expr::col with a tuple SeaQL#540

House keeping

  • Replace impl Default with #[derive(Default)] SeaQL#535
  • Exclude sqlx default features SeaQL#543
  • Use dtolnay/rust-toolchain instead of actions-rs/toolchain in CI SeaQL#544

0.27.2 - 2022-11-14

  • Made value::with_array module public and therefore making NotU8 trait public SeaQL#511

sea-query-binder 0.2.2

  • Enable SQLx features only if SQLx optional dependency is enabled SeaQL#517

0.27.1 - 2022-10-18

  • Fix consecutive spacing on schema statements SeaQL#481
  • SQLite bind rust_decimal & bigdecimal as f64 SeaQL#480

0.27.0 - 2022-10-16

New Features

  • Support CROSS JOIN SeaQL#376
  • We are going through series of changes to how database drivers work (SeaQL#416, SeaQL#423):
    1. sea-query-binder is now the recommended way (trait based) of working with SQLx, replacing sea-query-driver (macro based) SeaQL#434
    2. sea-query-binder is now a separate dependency, instead of integrated with sea-query SeaQL#432
    3. rusqlite support is moved to sea-query-rusqlite SeaQL#422
    4. postgres support is moved to sea-query-postgres SeaQL#433
  • Added sub-query operators: EXISTS, ALL, ANY, SOME SeaQL#379
  • Added support to ON CONFLICT WHERE SeaQL#447
  • Added support DROP COLUMN for SQLite SeaQL#455
  • Added YEAR, BIT and VARBIT types SeaQL#466
  • Added support one dimension Postgres array for SQLx SeaQL#467

Enhancements

  • Handle Postgres schema name for schema statements SeaQL#385
  • Added %, << and >> binary operators SeaQL#419
  • Added RAND function SeaQL#430
  • Implements Display for Value SeaQL#425
  • Added INTERSECT and EXCEPT to UnionType SeaQL#438
  • Added OnConflict::value and OnConflict::values SeaQL#451
  • ColumnDef::default now accepts both Value and SimpleExpr SeaQL#436
  • OrderedStatement::order_by_customs, OrderedStatement::order_by_columns, OverStatement::partition_by_customs, OverStatement::partition_by_columns now accepts IntoIterator<Item = T> instead of Vec<T> SeaQL#448
  • Expr::case, CaseStatement::case and CaseStatement::finally now accepts Into<SimpleExpr> instead of Into<Expr> SeaQL#460
  • UpdateStatement::value now accept Into<SimpleExpr> instead of Into<Value> SeaQL#460
  • TableAlterStatement::rename_column, TableAlterStatement::drop_column, ColumnDef::new, ColumnDef::new_with_type now accepts IntoIden instead of Iden SeaQL#472

Bug Fixes

  • distinct_on properly handles ColumnRef SeaQL#450
  • Removed ON for DROP INDEX for SQLite SeaQL#462
  • Change datetime string format to include microseconds SeaQL#468
  • ALTER TABLE for PosgreSQL with UNIQUE constraint SeaQL#472

Breaking changes

  • Changed in_tuples interface to accept IntoValueTuple SeaQL#386
  • Removed deprecated methods (or_where, or_having, table_column etc) SeaQL#380
  • Changed cond_where chaining semantics SeaQL#417
// Before: will extend current Condition
assert_eq!(
    Query::select()
        .cond_where(any![Expr::col(Glyph::Id).eq(1), Expr::col(Glyph::Id).eq(2)])
        .cond_where(Expr::col(Glyph::Id).eq(3))
        .to_owned()
        .to_string(PostgresQueryBuilder),
    r#"SELECT WHERE "id" = 1 OR "id" = 2 OR "id" = 3"#
);
// Before: confusing, since it depends on the order of invocation:
assert_eq!(
    Query::select()
        .cond_where(Expr::col(Glyph::Id).eq(3))
        .cond_where(any![Expr::col(Glyph::Id).eq(1), Expr::col(Glyph::Id).eq(2)])
        .to_owned()
        .to_string(PostgresQueryBuilder),
    r#"SELECT WHERE "id" = 3 AND ("id" = 1 OR "id" = 2)"#
);
// Now: will always conjoin with `AND`
assert_eq!(
    Query::select()
        .cond_where(Expr::col(Glyph::Id).eq(1))
        .cond_where(any![Expr::col(Glyph::Id).eq(2), Expr::col(Glyph::Id).eq(3)])
        .to_owned()
        .to_string(PostgresQueryBuilder),
    r#"SELECT WHERE "id" = 1 AND ("id" = 2 OR "id" = 3)"#
);
// Now: so they are now equivalent
assert_eq!(
    Query::select()
        .cond_where(any![Expr::col(Glyph::Id).eq(2), Expr::col(Glyph::Id).eq(3)])
        .cond_where(Expr::col(Glyph::Id).eq(1))
        .to_owned()
        .to_string(PostgresQueryBuilder),
    r#"SELECT WHERE ("id" = 2 OR "id" = 3) AND "id" = 1"#
);
  • CURRENT_TIMESTAMP changed from being a function to keyword SeaQL#441
  • Update SQLite boolean type from integer to boolean SeaQL#400
  • Changed type of ColumnType::Enum from (String, Vec<String>) to: SeaQL#435
Enum {
    name: DynIden,
    variants: Vec<DynIden>,
}
  • Deprecated InsertStatement::exprs, InsertStatement::exprs_panic, OnConflict::update_value, OnConflict::update_values, OnConflict::update_expr, OnConflict::update_exprs, UpdateStatement::col_expr, UpdateStatement::value_expr, UpdateStatement::exprs SeaQL#460
  • InsertStatement::values, UpdateStatement::values now accepts IntoIterator<Item = SimpleExpr> instead of IntoIterator<Item = Value> SeaQL#460
  • Use native api from SQLx for SQLite to work with time SeaQL#412

House keeping

Upgrades

  • Upgrade sqlx driver to 0.6.1

0.26.4 - 2022-10-13

New Features

  • Added support DROP COLUMN for SQLite SeaQL#455

Bug Fixes

  • Removed ON for DROP INDEX for SQLite SeaQL#462
  • Changed datetime display format to include microseconds SeaQL#468

0.26.3 - 2022-08-18

Bug Fixes

  • DROP NOT NULL for Postgres ALTER COLUMN SeaQL#394

House keeping

0.26.2 - 2022-07-21

Bug Fixes

  • Rename postgres-* features to with-* on postgres driver SeaQL#377

0.26.0 - 2022-07-02

New Features

Enhancements

  • Move escape and unescape string to backend SeaQL#306
  • LIKE ESCAPE support SeaQL#352 #353)
  • clear_order_by for OrderedStatement
  • Add method to make a column nullable SeaQL#365
  • Add is & is_not to Expr SeaQL#348
  • Add CURRENT_TIMESTAMP function SeaQL#349
  • Add in_tuples method to Expr SeaQL#345

Upgrades

  • Upgrade uuid to 1.0
  • Upgrade time to 0.3
  • Upgrade ipnetwork to 0.19
  • Upgrade bigdecimal to 0.3
  • Upgrade sqlx driver to 0.6

Breaking changes

  • As part of #306, the standalone functions escape_string and unescape_string are removed, and becomes backend specific. So now, you have to:
use sea_query::EscapeBuilder;

let string: String = MySqlQueryBuilder.escape_string(r#" "abc" "#);
let string: String = MysqlQueryBuilder.unescape_string(r#" \"abc\" "#);
  • Replace Value::Ipv4Network and Value::Ipv6Network to Value::IpNetwork SeaQL#364

  • Remove some redundant feature flags postgres-chrono, postgres-json, postgres-uuid, postgres-time. Use the with-* equivalence

Full Changelog: https://github.com/SeaQL/sea-query/compare/0.25.0...0.26.0

0.25.2 - 2022-07-01

New features

Enhancements

0.25.1 - 2022-06-26

Enhancements

  • clear_order_by for OrderedStatement

0.25.0 - 2022-05-28

New Features

  • CASE WHEN statement support SeaQL#304
  • Add support for Ip(4,6)Network and MacAddress SeaQL#309
  • [sea-query-attr] macro for deriving Iden enum from struct SeaQL#300
  • Add ability to alter foreign keys SeaQL#299
  • Select DISTINCT ON SeaQL#313

Enhancements

Bug fixes

  • Fix arguments when nesting custom expressions SeaQL#333
  • Fix clippy warnings for manual map SeaQL#337

Breaking Changes

  • Introducing a dedicated ReturningClause instead of reusing Select on returning: SeaQL#317
.returning(Query::select().column(Glyph::Id).take()) // before
.returning(Query::returning().columns([Glyph::Id])) // now
  • In #333, the custom expression API changed for Postgres, users should change their placeholder from ? to Postgres's $N
let query = Query::select()
    .columns([Char::Character, Char::SizeW, Char::SizeH])
    .from(Char::Table)
    .and_where(Expr::col(Char::Id).eq(1))
    .and_where(Expr::cust_with_values("6 = $2 * $1", vec![3, 2]).into())
    .to_owned();

assert_eq!(
    query.to_string(PostgresQueryBuilder),
    r#"SELECT "character", "size_w", "size_h" FROM "character" WHERE "id" = 1 AND 6 = 2 * 3"#
);

As a side effect, ?? is no longer needed for escaping ?

let query = Query::select()
    .expr(Expr::cust_with_values(
        "data @? ($1::JSONPATH)",
        vec!["hello"],
    ))
    .to_owned();

assert_eq!(
    query.to_string(PostgresQueryBuilder),
    r#"SELECT data @? ('hello'::JSONPATH)"#
);
  • In #314, ColumnType's Binary(Option<u32>) changed to Binary(BlobSize), so if you used Binary(None) before, you should change to Binary(BlobSize::Blob(None))

Full Changelog: https://github.com/SeaQL/sea-query/compare/0.24.0...0.25.0

0.24.6 - 2022-05-12

  • Make sea-query-driver an optional dependency SeaQL#324

0.24.5 - 2022-05-09

0.24.4 - 2022-04-26

  • update sea-query-driver

0.24.3 - 2022-04-26

Bug fixes

Enhancements

  • Add length check on condition array SeaQL#307

0.24.2 - 2022-04-18

Bug fixes

Notes: 0.24.0 & 0.24.1 were yanked

0.24.1 - 2022-04-15

Enhancements

  • #295 Add parameter for SQLx path to proc-macro SeaQL#297

Bug fixes

0.24.0 - 2022-04-05

New Features

Enhancements

  • Add support for multiple ALTER operations SeaQL#277
  • #229 add column if not exists SeaQL#278
  • #255 Add support to CommonTableExpression columns method SeaQL#284
  • #280 Rewrite drivers using proc-macro SeaQL#292

Bug fixes

  • #285 Fix timestamp_with_time_zone_len SeaQL#286

Breaking changes

  • The enum variants for LockType were renamed: Exclusive -> Update and Shared -> Share
  • As part of #283, the drivers are split to the sea-query-driver crate
    1. Remove methods Value::is_json and Value::as_ref_json when feature: with-json is disabled
    2. Remove methods Value::is_time_* and Value::as_ref_time_* when feature: with-time is disabled
    3. Remove methods Value::is_chrono_* and Value::as_ref_chrono* when feature: with-chrono is disabled
    4. Remove methods Value::is_decimal, Value::as_ref_decimal and Value::decimal_to_f64 when feature: with-rust_decimal is disabled
    5. Remove methods Value::is_big_decimal, Value::as_ref_big_decimal and Value::big_decimal_to_f64 when feature: with-bigdecimal is disabled
    6. Remove methods Value::is_uuid and Value::as_ref_uuid when feature: with-uuid is disabled
    7. Remove methods Value::is_array and Value::as_ref_array when feature: postgres-array is disabled

Full Changelog: https://github.com/SeaQL/sea-query/compare/0.23.0...0.24.0

0.23.0 - 2022-03-15

New Features

  • Supports time in addition to chrono SeaQL#267

Enhancements

  • Allow for trailing commas in any and all macros SeaQL#270

Bug fixes

  • Fix UNIQUE table index expression syntax for sqlite SeaQL#227

Breaking changes

In order to co-exist with the time crate, Date, Time, DateTime etc are renamed to ChronoDate, ChronoTime, ChronoDateTime. In addition, new variants TimeDate, TimeTime, TimeDateTime and so on are introduced to Value.

0.22.0 - 2022-02-26

New Features

  • Support multiple tables in the select from by @Sytten in SeaQL#261
  • Add support for replace insert by @Sytten in SeaQL#262
  • Add ColumnType unsigned integer types by @billy1624 in SeaQL#211

Full Changelog: https://github.com/SeaQL/sea-query/compare/0.21.0...0.22.0

0.21.0 - 2022-02-01

Breaking Changes

  • Use double quotes for quoting identifiers for SQLite by @SpyrosRoum in SeaQL#221

New Features

  • Implement RETURNING for SQLite by @SpyrosRoum in SeaQL#194
  • Support 'NULLS LAST' and 'NULLS FIRST' by @qyihua in SeaQL#210
  • [join-lateral] by @rex-remind101 in SeaQL#224
  • Insert from select by @05storm26 in SeaQL#238
  • Add Expr::asterisk() and Expr::tbl_asterisk(table: DynIden) methods - Fix #217 by @RomainMazB in SeaQL#219

Enhancements

  • Implement ToTokens for IntervalField by @autarch in SeaQL#195
  • Implemented 'Array' type for Postgres. by @kev0960 in SeaQL#205
  • Add Value::DateTimeLocal by @billy1624 in SeaQL#249
  • Add ColumnRef::SchemaTableColumn by @billy1624 in SeaQL#206
  • Datetime utc by @tyt2y3 in SeaQL#241
  • Support the use of chrono::DateTime using the type alias DateTim… by @charleschege in SeaQL#222

Bug Fixes

  • Fix Postgres ColumnType::TinyInteger mapping by @billy1624 in SeaQL#207
  • PR without clippy warmings in file changed tab by @billy1624 in SeaQL#212

Full Changelog: https://github.com/SeaQL/sea-query/compare/0.20.0...0.21.0

0.20.0 - 2021-12-11

Merged PRs

  • Add TableRef::DatabaseSchemaTable by @billy1624 in SeaQL#193

Full Changelog: https://github.com/SeaQL/sea-query/compare/0.19.4...0.20.0

0.19.4 - 2021-12-11

Merged PRs

  • Binding DateTime<FixedOffset> for SQLx MySQL & SQLite by @billy1624 in SeaQL#197

Full Changelog: https://github.com/SeaQL/sea-query/compare/0.19.2...0.19.4

0.19.2 - 2021-12-04

Merged PRs

  • Impl ValueTuple Up to Six by @billy1624 in SeaQL#200
  • Basic Benchmark by @tyt2y3 in SeaQL#192

Full Changelog: https://github.com/SeaQL/sea-query/compare/0.19.1...0.19.2

0.19.1 - 2021-11-25

Merged PRs

  • driver/postgres handle non-exhaustive Value by @billy1624 in SeaQL#191

Full Changelog: https://github.com/SeaQL/sea-query/compare/0.19.0...0.19.1

0.19.0 - 2021-11-19

Merged PRs

  • TableCreateStatement and TableDropStatement takes any IntoTableRef table name. by @josh-codes in SeaQL#186
  • Add ColumnType::Enum by @billy1624 in SeaQL#188
  • Update to Rust Edition 2021 by @billy1624 in SeaQL#189

Full Changelog: https://github.com/SeaQL/sea-query/compare/0.18.2...0.19.0

0.18.2 - 2021-11-04

Merged PRs

  • Rename "where" keywords in SelectStatement to suppress IDEA warnings by @baoyachi in SeaQL#166
  • Add binary method to expr by @Progdrasil in SeaQL#173
  • Cast expression as custom type by @billy1624 in SeaQL#170
  • Support tuple expression by @shuoli84 in SeaQL#178

Full Changelog: https://github.com/SeaQL/sea-query/compare/0.18.1...0.18.2

0.18.1 - 2021-10-26

  • [#169] Add support for Postgres interval type
  • [#171] Fix bug in Condition::add where Condition negation is ignored

0.18.0 - 2021-10-15

  • [#159] Add ValueType::column_type
  • [#160] Add FromValueTuple trait

0.17.3 - 2021-10-26

  • [#171] Fix bug in Condition::add where Condition negation is ignored

0.17.2 - 2021-10-15

  • [#164] Revert "Fix SQLite chrono::NaiveTime binding"

0.17.1 - 2021-10-12 (yanked)

0.17.0 - 2021-10-06

  • [#157] Fix binding nullable custom types on db drivers

The as_ref_* methods on Value are changed:

pub fn as_ref_json(&self) -> &Json;

Is now

pub fn as_ref_json(&self) -> Option<&Json>;

0.16.6 - 2021-10-26

  • [#171] Fix bug in Condition::add where Condition negation is ignored

0.16.5 - 2021-09-30

  • [#145] Add Condition::not
  • [#149] Fix SQLite chrono::NaiveTime binding

0.16.4 - 2021-09-26

  • Fix table drop options for SQLite
  • Add IndexCreateStatement::is_unique_key()

0.16.3 - 2021-09-17

  • [#131] CAST AS expression
  • [#131] InsertStatement accepts SimpleExpr
  • [#137] SQLx Postgres driver bind DateTime<FixedOffset>

0.16.2 - 2021-09-15

  • [#120] Support RETURNING for DeleteStatement
  • [#128] Support UNION clause for SelectStatement

0.16.1 - 2021-09-10

  • [#129] MySql ColumnType::Binary(None) maps to "blob"

0.16.0 - 2021-09-02

  • [#112] Introduce Nullable trait to permit custom Option<T>

  • [#113] ValueType trait should have a non-panic-ing method

  • [#114] ValueType revamp

    1. Remove ValueTypeDefault
    2. Change type_name to return String
  • [#115] Postgres concatenate operator (||)

  • [#117] Lock support (FOR SHARE, FOR UPDATE) for SELECT statement

0.15.0 - 2021-08-21

  • [#107] Revamp Value to typed null value
  • Added BigDecimal support

The Value::Null variant is removed. You have to use a specific variant with a None.

Before:

Query::insert()
    .values_panic(vec![
        Value::Null,
        2.1345.into(),
    ])

After:

Query::insert()
    .values_panic(vec![
        Value::String(None),
        2.1345.into(),
    ])

Since we cannot handle the generic Null value on JSON, we removed the json method on InsertStatement and UpdateStatement. The following NO LONGER WORKS:

let query = Query::insert()
    .into_table(Glyph::Table)
    .json(json!({
        "aspect": 2.1345,
        "image": "24B",
    }));
let query = Query::update()
    .table(Glyph::Table)
    .json(json!({
        "aspect": 2.1345,
        "image": "235m",
    }));

In addition, if you constructed Value manually before (instead of using into() which is unaffected), you have to wrap them in an Option:

Before:

let (sql, values) = query.build(PostgresQueryBuilder);
assert_eq!(
	values,
	Values(vec![Value::String(Box::new("A".to_owned())), Value::Int(1), Value::Int(2), Value::Int(3)]))
);

After:

let (sql, values) = query.build(PostgresQueryBuilder);
assert_eq!(
	values,
	Values(vec![Value::String(Some(Box::new("A".to_owned()))), Value::Int(Some(1)), Value::Int(Some(2)), Value::Int(Some(3))]))
);

0.14.1 - 2021-08-15

  • [#87] Fix inconsistent Ownership of self in Builder APIs
  • [#105] Use Arc for SeaRc with feature flag thread-safe

0.12.12 - 2021-08-14

  • [#98] Support Postgres full text search

0.12.11 - 2021-08-13

  • Support SeaORM

0.12.10 - 2021-08-11

  • [#89] flattening iden enums in derive macro

0.12.9 - 2021-08-08

  • [#77] Postgres binary type
  • [#81] example for CockroachDB
  • [#84] Fix Postgres constraint keywords
  • [#75] DateTimeWithTimeZone value type and TimestampWithTimeZone column type

0.12.8 - 2021-07-24

  • Fix Postgres datetime column type mapping
  • Uuid in schema builder

0.12.7 - 2021-07-13

  • cust_with_values allow escape ? using ??

0.12.6 - 2021-07-07

  • Fixed build error for sqlx-sqlite

0.12.5 - 2021-07-07

  • Support Decimal from rust_decimal

0.12.4 - 2021-06-23

  • Added returning for update statement

0.12.3 - 2021-06-19

  • Added type_name for ValueType
  • Values derive Clone
  • Added Update::col_expr
  • Type def Rc as SeaRc
  • getters for schema statements

0.12.2 - 2021-06-04

  • Fixed and_where_option
  • Added Condition::add_option

0.12.1 - 2021-06-03

  • Added not_in_subquery

0.12.0 - 2021-05-31

  • Unify cond_where and and_where. Note: will panic if calling or_where after and_where.

0.11.1 - 2021-05-22

  • Updated Readme

0.11.0 - 2021-05-19

  • Added APIs to support ORM
  • Backend and internal refactoring
  • Introduced QueryStatementBuilder and SchemaStatementBuilder traits
  • Introduced ConditionalStatement and OrderedStatement traits
  • Introduced any/all style conditions for cond_where and cond_having

0.10.6 - 2021-05-04

  • Postgres ALTER TYPE statements for ENUM

0.10.5 - 2021-05-02

  • Updated documentation

0.10.4 - 2021-05-02

  • returning() expression for Postgres insert statements
  • Remove redundant index name in foreign key expression of MySQL

0.10.3 - 2021-04-30

  • custom Error type
  • Empty value list for IN
  • Index prefix and IndexOrder

0.10.2 - 2021-04-27

  • Foreign key API from and to
  • Fix foreign key bug in ON UPDATE

0.10.1 - 2021-04-25

  • Added index_type() (FullText and Hash)
  • Added unique() to Index
  • Support composite primary key

0.10.0 - 2021-04-23

  • Use IntoIterator trait instead of Vec on most APIs
  • UUID support in Value
  • Rusqlite support

0.9.6 - 2021-04-18

  • Rename create_if_not_exists to if_not_exists
  • Remove partition_option from TableAlterStatement
  • Added ColumnDef::extra()

0.9.5 - 2021-04-17

  • Added SchemaStatement

0.9.4 - 2021-04-13

  • Fixed DateTime quoting bugs

0.9.3 - 2021-04-08

  • Update sea-query-derive to 0.1.2

0.9.2 - 2021-04-05

  • derive supporting enum tuple variant and custom method

0.9.1 - 2021-03-30

  • updated docs

0.9.0 - 2021-03-29

  • Introduced IntoColumnRef trait to consolidate column and table.column
  • Introduced IntoTableRef trait to consolidate table and schema.table
  • Introduced IntoIden trait to remove *_dyn methods

0.8.5 - 2021-03-29

  • added into_simple_expr()

0.8.4 - 2021-03-24

  • Fixing IS NULL

0.8.3 - 2021-03-23

  • derive Debug on most structs

0.8.2 - 2021-03-23

  • Added unescape_string

0.8.1 - 2021-03-23

  • Improve documentation

0.8.0 - 2021-03-14

  • json support behind features
  • backend as features (backend-mysql, backend-postgres, backend-sqlite)
  • added from_schema(), from_schema_as()

0.7.0 - 2021-03-06

  • Revamp Value
  • build() API change
  • postgres driver support
  • json and chrono support

0.6.1 - 2021-03-05

  • Added join_as
  • Deprecated expr_alias, from_alias

0.6.0 - 2021-02-20

  • Custom expression with parameters Expr::cust_with_values()
  • Custom function call Func::cust()
  • Postgres enum Type::create().as_enum()

0.5.0 - 2021-02-09

  • derive macro #[derive(Iden)]

0.4.0 - 2021-02-02

  • Added JSON binary column type ColumnDef::json_binary()
  • Custom column type ColumnDef::custom()

0.3.0 - 2020-12-29

0.2.0 - 2020-12-26

0.1.0 - 2020-12-16

Publish to crate.io