easy-sql 0.101.1

Macro-first SQL toolkit with compile-time checked queries, optional migrations on top of sqlx.
Documentation
use easy_macros::always_context;

#[allow(dead_code)]
struct DatabaseSetupTest {
    t: ExampleTable,
}

use super::TestDriver;
use crate::{self as sql_crate, Driver, EasySqlTables_create, traits::InternalDriver};

#[allow(dead_code)]
struct ExampleReferencedTable {
    id: i64,
}

#[always_context]
impl sql_crate::Table<TestDriver> for ExampleReferencedTable {
    fn table_name() -> &'static str {
        "example_table2"
    }

    fn primary_keys() -> Vec<&'static str> {
        vec!["id"]
    }

    fn table_joins(_current_query: &mut String) {}
}

#[allow(dead_code)]
struct ExampleTable {
    id: i64,
    field0: String,
    field1: String,
    field2: i32,
    field3: i64,
    field4: i16,
}

#[always_context]
impl sql_crate::Table<TestDriver> for ExampleTable {
    fn table_name() -> &'static str {
        "example_table"
    }

    fn primary_keys() -> Vec<&'static str> {
        vec!["id"]
    }

    fn table_joins(_current_query: &mut String) {}
}

#[always_context]
#[no_context_inputs]
impl sql_crate::DatabaseSetup<TestDriver> for ExampleTable {
    async fn setup(
        conn: &mut (impl crate::EasyExecutor<TestDriver> + Send + Sync),
    ) -> anyhow::Result<()> {
        use ::anyhow::Context;

        let table_exists = <TestDriver as Driver>::table_exists(conn, "example_table")
            .await
            .with_context(easy_macros::context!(
                "Checking if table exists: {:?}",
                "example_table"
            ))?;

        if table_exists {
            // Get Table Version and migrate (alter table + update version) if neccessary
        } else {
            // Create table and create version in EasySqlTables
            <TestDriver as Driver>::create_table(
                conn,
                "example_table2",
                vec![sql_crate::driver::TableField {
                    name: "id",
                    data_type: {
                        use crate::macro_support::TypeInfo;

                        <i64 as crate::macro_support::Type<InternalDriver<TestDriver>>>::type_info()
                            .name()
                            .to_string()
                    },
                    is_unique: false,
                    is_not_null: false,
                    default: None,
                    is_auto_increment: true,
                }],
                vec!["id"],
                {
                    vec![(
                        <ExampleReferencedTable as sql_crate::Table<TestDriver>>::table_name(),
                        (
                            vec!["field3"],
                            <ExampleReferencedTable as sql_crate::Table<TestDriver>>::primary_keys(
                            ),
                            false,
                        ),
                    )]
                    .into_iter()
                    .collect()
                },
            )
            .await?;
            EasySqlTables_create!(TestDriver, *conn, "table_name".to_string(), 5);
        }

        Ok(())
    }
}