diesel-derive-composite

Crates.iodiesel-derive-composite
lib.rsdiesel-derive-composite
version0.1.0
created_at2025-10-16 22:35:28.099645+00
updated_at2025-10-16 22:35:28.099645+00
descriptionDerive diesel traits for PostgreSQL composite types
homepage
repositoryhttps://github.com/19wintersp/diesel-derive-composite
max_upload_size
id1886880
size29,159
Patrick Winters (19wintersp)

documentation

README

diesel-derive-composite

Derive diesel traits for PostgreSQL composite types.

Generates boilerplate implementations of ToSql and FromSql for enums and structs representing PostgreSQL composite types. Works with Diesel 2.3.

Licensed under the MIT or Apache 2.0 licence.

Usage

For example, consider composite types declared as follows:

create type my_enum as enum (
	'variant_one',
	'variant_two'
);

create type my_struct as (
	field_one text,
	field_two my_enum
);

From this schema, the Diesel CLI may generate stub types:

// @generated automatically by Diesel CLI.

pub mod sql_types {
	#[derive(diesel::query_builder::QueryId, Clone, diesel::sql_types::SqlType)]
	#[diesel(postgres_type(name = "my_enum"))]
	pub struct MyEnum;

	#[derive(diesel::query_builder::QueryId, Clone, diesel::sql_types::SqlType)]
	#[diesel(postgres_type(name = "my_struct"))]
	pub struct MyStruct;
}

To generate model types which work with these types, derive Composite:

use diesel::deserialize::FromSqlRow;
use diesel::expression::AsExpression;
use diesel_derive_composite::Composite;

#[derive(Debug, Composite, FromSqlRow, AsExpression)]
#[diesel(sql_type = schema::sql_types::MyEnum)]
enum MyEnum {
	VariantOne,
	VariantTwo,
}

#[derive(Debug, Composite, FromSqlRow, AsExpression)]
#[diesel(sql_type = schema::sql_types::MyStruct)]
struct MyStruct {
	#[diesel_composite(sql_type = diesel::sql_types::Text)]
	field_one: String,
	#[diesel_composite(sql_type = schema::sql_types::MyEnum)]
	field_two: MyEnum,
}

If the schema types are not generated by Diesel, Composite can generate them instead:

#[derive(Debug, Composite, FromSqlRow, AsExpression)]
#[diesel(sql_type = PgMyEnum)]
#[diesel_composite(postgres_type(name = "my_enum"))]
enum MyEnum {
	VariantOne,
	VariantTwo,
}

#[derive(Debug, Composite, FromSqlRow, AsExpression)]
#[diesel(sql_type = PgMyStruct)]
#[diesel_composite(postgres_type(name = "my_struct"))]
struct MyStruct {
	#[diesel_composite(sql_type = diesel::sql_types::Text)]
	field_one: String,
	#[diesel_composite(sql_type = PgMyEnum)]
	field_two: MyEnum,
}

For a full list of options, see the documentation for Composite.

Commit count: 0

cargo fmt