#sql-database #sql #proc-macro #define

sql-table

Makes no-ORM querying of SQL databases more concise

4 releases

0.1.4 Jul 30, 2023
0.1.3 Jul 30, 2023
0.1.2 Apr 7, 2023
0.1.1 Apr 6, 2023
0.1.0 Apr 6, 2023

#1381 in Database interfaces

MIT license

16KB
266 lines

sql-table

Makes no-ORM querying of SQL databases more concise.

Cargo Documentation License

Examples

Basic usage:

use sql_table::{
    table, inject, 
    ForeignKeyName, IndexName, Qualified, Table, TableColumn, Unquote,
};

table!(Person: "person" {
    Name: "name",
    Country: "country",
});

assert_eq!(
    inject!("
        SELECT #{Person::Name}#
        FROM #{Person}#
        WHERE #{Person::Country}# = 'United States'
    "),
    format!("
        SELECT name
        FROM person
        WHERE country = 'United States'
    ")
);

If you need more sophisticated behaviour:

use sql_table::{
    table, inject, 
    ForeignKeyName, IndexName, Qualified, Table, TableColumn, Unquote,
};

// If you want a specific table identifiers to be displayed by default as quoted
// just add `quote` parameter after table definition.
table!(SimCard: "sim card" {
    Owner: "owner",
    PhoneNumber: "phone number",
}, quote: "`");

table!(Person: "person" {
    Name: "name",
    Country: "country",
});

// Identifiers can also be unquoted using `.unquoted()` method,
// or, in case of field names, they can be converted into qualified form 
// using `.qualified()` method of trait `Qualified` provided by this library
// and implemented for all fields of each generated table.
// Said methods can also be chained `.unquoted().qualified()`.
assert_eq!(
    inject!("
        SELECT #{SimCard::PhoneNumber.qualified()}#
        FROM #{SimCard}#
        JOIN #{Person}# ON #{Person::Name.qualified()}# = #{SimCard::Owner.unquoted().qualified()}#
        WHERE #{Person::Country.qualified()}# = 'United States'
    "),
    format!("
        SELECT `sim card`.`phone number`
        FROM `sim card`
        JOIN person ON person.name = `sim card`.owner
        WHERE person.country = 'United States'
    ")
);

// Format: fk_<target table>_<target field>_<source table>_<source field>
// The whole name will get quoted if any of it's components (table/field names) are quoted.
// In this case quotation will be done using the first found quote
// of corresponding components listed in the key name.
assert_eq!(
    SimCard::Owner.foreign_key_name(Person::Name),
    "`fk_sim card_owner_person_name`"
);
assert_eq!(
    <SimCard as Table>::Unquoted::Owner.unquoted().foreign_key_name(Person::Name),
    "fk_sim card_owner_person_name"
);

// Format: ix_<table>_<field 1>_<field 2>_..._<field n>
// All fields must be either quoted or unquoted.
// The whole name will get quoted if either table or fields are quoted.
assert_eq!(
    Person::index_name(&[Person::Name]),
    "ix_person_name"
);
assert_eq!(
    SimCard::index_name(&[SimCard::Owner, SimCard::PhoneNumber]),
    "`ix_sim card_owner_phone number`"
);
assert_eq!(
    <SimCard as Table>::Unquoted::index_name(&[
        <SimCard as Table>::Unquoted::Owner.unquoted(), 
        <SimCard as Table>::Unquoted::PhoneNumber.unquoted()
    ]),
    "ix_sim card_owner_phone number"
);

// If you need a different naming format for foreign keys, indices or anything else
// you can implement custom `IndexName`, `ForeignKeyName`, etc. traits
// using provided by this library default implementations as a reference.

Dependencies