#mysql #derive #sql #traits #procedural #proc-macro #accompany

macro derive-sql-mysql

Accompany the derive-sql crate. Implements the DeriveMySql procedural macro to implement trait for MySQL

4 releases (2 breaking)

0.9.0 Apr 7, 2024
0.8.1 Mar 18, 2024
0.8.0 Feb 11, 2024
0.7.0 Feb 4, 2024

#1 in #accompany

Download history 2/week @ 2024-02-12 59/week @ 2024-02-19 22/week @ 2024-02-26 113/week @ 2024-03-18 80/week @ 2024-04-01 24/week @ 2024-04-08

217 downloads per month
Used in 2 crates (via derive-sql)

MIT license

26KB
378 lines

Procedural macro to automatically generate an Sqlable trait for the provided struct that is compatible with an MySQL database connected using the mysql crate https://crates.io/crates/mysql.

How to use

You write:

#[derive(DeriveMysql)]
pub struct Person {
  name: String,
  age: u32,
}

And you can use:


let pool = ::mysql::Pool::new("mysql://test@localhost/simpledb").unwrap();
let mut connection = pool.get_conn().unwrap();
let mut db: PersonMysql<_> = derive_sql::mysql::Conn::from(connection).into();

// initialise
db.create_table().unwrap();

// Insert entries
db.insert(Person {name: "Abi".to_string(), age: 31 }).unwrap();
db.insert(Person {name: "Bert".to_string(), age: 32 }).unwrap();
db.insert(Person {name: "Charlie".to_string(), age: 33 }).unwrap();

// Query
let persons: Vec<Person> = db.select(Box::new(SimpleFilter::try_from(("age", 32)).unwrap())).unwrap();
assert!(persons[0].name.eq("Bert"));

// Update
db.update(Box::new(SimpleFilter::try_from(("name", "Abi")).unwrap()), Person { name: "Abi".to_string(), age: 32 }).unwrap();

// Delete
db.delete(Box::new(SimpleFilter::try_from(("name", "Abi")).unwrap())).unwrap();

// Clear the table
db.delete_table().unwrap();

Container attributes:

  • #[derive_sqlite(ident = ...)] overwrite the name of the rusqlite wrapper from {class}Mysql;
  • #[derive_sqlite(table_name = "...")] specify the name of the table (default to the container name in lower case);

Field attributes:

  • #[derive_sqlite(is_primary_key = true)] nominate that one of the field is a primary key. Only one primary key can be specified. primary key fields are unique in the table. Primary key can NOT be a String - the following will not compile:
#[derive(DeriveMysql)]
pub struct Person {
  #[derive_sqlite(is_primary_key = true)]
  name: String,
  age: u32,
}
  • #[derive_sqlite(on_insert = ...)] nominate a function of the type fn() -> {type} with {type} corresponding to the type of the field. The function is called when the item is inserted and the value returned by the function is assigned to the field before the item is inserted. Typical use is to assign a creation date.
  • #[derive_sqlite(on_update = ...)] nominate a function of the type fn() -> {type} with {type} corresponding to the type of the field. The function is called when the item is updated and the value returned by the function is assigned to the field before the item is updated. Typical use is to assign a last modified date.

Dependencies

~0.8–1.3MB
~26K SLoC