برنامه نویسی

دستور العمل های زنگ زده: sqlx + Uuid

Summarize this content to 400 words in Persian Lang
برای افراد بی حوصله – اینجا لینک کد من در GitHub است. برای بقیه – به خواندن ادامه دهید.

کتابخانه مورد استفاده: sqlx-postgres

کتابخانه sqlx یک روش محبوب برای اتصال به یک db رابطه‌ای است و علیرغم آنچه چندین مثال ممکن است شما را باور کند، نسخه فعلی (0.8.0 تا لحظه نگارش این مقاله) این کار را انجام می‌دهد. Uuidخوب است

Uuid در مقابل i64

من به دنبال یک مثال خوب برای اتصال Rust به Postgres DB بودم. یک مشکل وجود داشت که به اندازه کافی در آنجا حل نشده بود – درج داده ها در پایگاه داده که در آن شناسه در Rust یک Uuid (uuid در db)، نه a i64 (bigserial در db).

به عنوان مثال، این ساختار ساده من است:

#[derive(Debug, FromRow)] pub struct Message {
pub id: Uuid, //
pub content: String,
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

من سعی کردم مراحل مشابه ساختارهایی را که کاربرد دارند دنبال کنم i64 برای id، اما کامپایلر rust راضی نبود البته.پس از خواندن چند بحث آنلاین و کمی آزمایش، توانستم به آنچه می خواستم برسم و معلوم شد که آنقدرها هم سخت نیست!به اشتراک گذاری آن به نفع دیگران 😉

یک جدول ایجاد کنید

راه‌های بهتری برای ایجاد جدول نسبت به استفاده از کد زنگ‌زدگی وجود دارد، اما از آنجایی که نمونه‌های زیادی نحوه انجام آن را نشان می‌دهند (و معمولاً دارای شناسه به عنوان i64من هم تصمیم گرفتم این کار را انجام دهم، اما با شناسه a Uuid :پ

اگر شناسه ما i64 باشد چگونه می توانیم یک جدول جدید ایجاد کنیم:

async fn init_messages_table(pool: &PoolPostgres>) -> () {
sqlx::query(
r#”
CREATE TABLE IF NOT EXISTS messages (
id bigserial,
content text
);”#,
)
.execute(pool)
.await
.expect(“postgres messages_table creation error”);
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و در اینجا این است که چگونه می توانیم همین کار را انجام دهیم اگر شناسه ما a باشد Uuid:

async fn init_messages_table(pool: &PoolPostgres>) -> () {
sqlx::query(
r#”
CREATE TABLE IF NOT EXISTS messages (
id uuid,
content text
);”#,
)
.execute(pool)
.await
.expect(“postgres messages_table creation error”);
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تنها کاری که باید انجام دهید این است که شناسه خود را به این شکل اعلام کنید: id uuid به عنوان مخالف id bigserial. مرتب!

ایجاد/درج داده

این قسمتی است که به احتمال زیاد می خواهید ببینید.

در اینجا نحوه درج یک ردیف جدید در صورتی است که شناسه ما یک است i64:

let row: (i64,) =
sqlx::query_as(“insert into messages (content) values ($1) returning id”)
.bind(req.content.to_owned())
.fetch_one(&data.db_pool)
.await
.expect(“postgres insertion error”);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای مورد were ID یک است Uuid، در عوض این کار را انجام می دهیم:

let id = sqlx::types::Uuid::from_u128(uuid::Uuid::new_v4().as_u128());
let row: (sqlx::types::Uuid,) =
sqlx::query_as(“insert into messages (id, content) values ($1, $2) returning id”)
.bind(id.to_owned())
.bind(req.content.to_owned())
.fetch_one(&data.db_pool)
.await
.expect(“postgres insertion error”);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به این دو تفاوت اصلی توجه کنید:

نوع بازگشت از ردیف است (sqlx::types::Uuid,) بجای(i64,)- اما این چیزی است که شما انتظار دارید.
شناسه داده ها از Rust می آید – اینجا جایی است که ما آن را ایجاد می کنیم Uuid برخلاف سناریویی که پایگاه داده id داده ها را با افزایش شناسه ردیف قبلی محاسبه می کند.از آنجایی که پایگاه داده ما مقدار id را نمی داند، باید آن را از Rust پاس کنیم. و بنابراین، ما یک بخش اضافی از اطلاعات را ارائه و متصل کنید- Uuid ما تولید کردیم.

توجه داشته باشید

من چند کد قدیمی را به صورت آنلاین دیدم که AS “id: Uuid” را به پرس و جو اضافه کرد:

sqlx::query_as(“insert into messages (id, content) values ($1, $2) returning id AS \”id: Uuid\””)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اما معلوم می شود، با جریان لازم نیست sqlx نسخه

داده ها را بخوانید

تعجب! وقتی نوبت به خواندن داده ها از پایگاه داده می شود، نیازی به انجام هیچ گونه تنظیماتی نداشتم:

let select_query = sqlx::query_as::_, Message>(“SELECT id, content FROM messages”);
let messages: VecMessage> = select_query
.fetch_all(&data.db_pool)
.await
.expect(“postgres selection error”);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به نظر می رسد که جادوی کتابخانه sqlx می تواند نوع ما را مرتب کند id!

یک لحظه شکرگزاری

با تشکر از شما، کسی که به طور تصادفی به این پست برخورد کرد و به آن نگاه کردمن تازه شروع به کار کردم، پس در نظر داشته باشید که برای من بازخورد بگذارید.

آیا شما یک هموطنان روستایی هستید؟ آیا این مطلب به شما کمک کرد؟دوست دارید به عنوان یک دستور پخت زنگ زده به چه مسائل دیگری مربوط به زنگ پرداخته شود؟

یادآوری – کد این پست در GitHub من وجود دارد.

برای افراد بی حوصله – اینجا لینک کد من در GitHub است.
برای بقیه – به خواندن ادامه دهید.

کتابخانه مورد استفاده: sqlx-postgres

کتابخانه sqlx یک روش محبوب برای اتصال به یک db رابطه‌ای است و علیرغم آنچه چندین مثال ممکن است شما را باور کند، نسخه فعلی (0.8.0 تا لحظه نگارش این مقاله) این کار را انجام می‌دهد. Uuidخوب است

Uuid در مقابل i64

من به دنبال یک مثال خوب برای اتصال Rust به Postgres DB بودم. یک مشکل وجود داشت که به اندازه کافی در آنجا حل نشده بود – درج داده ها در پایگاه داده که در آن شناسه در Rust یک Uuid (uuid در db)، نه a i64 (bigserial در db).

به عنوان مثال، این ساختار ساده من است:

#[derive(Debug, FromRow)]
pub struct Message {
    pub id: Uuid, // 
    pub content: String,
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

من سعی کردم مراحل مشابه ساختارهایی را که کاربرد دارند دنبال کنم i64 برای id، اما کامپایلر rust راضی نبود البته.
پس از خواندن چند بحث آنلاین و کمی آزمایش، توانستم به آنچه می خواستم برسم و معلوم شد که آنقدرها هم سخت نیست!
به اشتراک گذاری آن به نفع دیگران 😉

یک جدول ایجاد کنید

راه‌های بهتری برای ایجاد جدول نسبت به استفاده از کد زنگ‌زدگی وجود دارد، اما از آنجایی که نمونه‌های زیادی نحوه انجام آن را نشان می‌دهند (و معمولاً دارای شناسه به عنوان i64من هم تصمیم گرفتم این کار را انجام دهم، اما با شناسه a Uuid

اگر شناسه ما i64 باشد چگونه می توانیم یک جدول جدید ایجاد کنیم:

async fn init_messages_table(pool: &PoolPostgres>) -> () {
    sqlx::query(
        r#"
    CREATE TABLE IF NOT EXISTS messages (
      id bigserial,
      content text
    );"#,
    )
    .execute(pool)
    .await
    .expect("postgres messages_table creation error");
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و در اینجا این است که چگونه می توانیم همین کار را انجام دهیم اگر شناسه ما a باشد Uuid:

async fn init_messages_table(pool: &PoolPostgres>) -> () {
    sqlx::query(
        r#"
    CREATE TABLE IF NOT EXISTS messages (
      id uuid,
      content text
    );"#,
    )
    .execute(pool)
    .await
    .expect("postgres messages_table creation error");
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تنها کاری که باید انجام دهید این است که شناسه خود را به این شکل اعلام کنید: id uuid به عنوان مخالف id bigserial. مرتب!

ایجاد/درج داده

این قسمتی است که به احتمال زیاد می خواهید ببینید.

در اینجا نحوه درج یک ردیف جدید در صورتی است که شناسه ما یک است i64:

let row: (i64,) =
        sqlx::query_as("insert into messages (content) values ($1) returning id")
            .bind(req.content.to_owned())
            .fetch_one(&data.db_pool)
            .await
            .expect("postgres insertion error");
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای مورد were ID یک است Uuid، در عوض این کار را انجام می دهیم:

    let id = sqlx::types::Uuid::from_u128(uuid::Uuid::new_v4().as_u128());
    let row: (sqlx::types::Uuid,) =
        sqlx::query_as("insert into messages (id, content) values ($1, $2) returning id")
            .bind(id.to_owned())
            .bind(req.content.to_owned())
            .fetch_one(&data.db_pool)
            .await
            .expect("postgres insertion error");
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به این دو تفاوت اصلی توجه کنید:

  • نوع بازگشت از ردیف است (sqlx::types::Uuid,) بجای(i64,)– اما این چیزی است که شما انتظار دارید.

  • شناسه داده ها از Rust می آید – اینجا جایی است که ما آن را ایجاد می کنیم Uuid برخلاف سناریویی که پایگاه داده id داده ها را با افزایش شناسه ردیف قبلی محاسبه می کند.

    از آنجایی که پایگاه داده ما مقدار id را نمی داند، باید آن را از Rust پاس کنیم. و بنابراین، ما یک بخش اضافی از اطلاعات را ارائه و متصل کنیدUuid ما تولید کردیم.

توجه داشته باشید

من چند کد قدیمی را به صورت آنلاین دیدم که AS “id: Uuid” را به پرس و جو اضافه کرد:

sqlx::query_as("insert into messages (id, content) values ($1, $2) returning id AS \"id: Uuid\"")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اما معلوم می شود، با جریان لازم نیست sqlx نسخه

داده ها را بخوانید

تعجب! وقتی نوبت به خواندن داده ها از پایگاه داده می شود، نیازی به انجام هیچ گونه تنظیماتی نداشتم:

    let select_query = sqlx::query_as::_, Message>("SELECT id, content FROM messages");
    let messages: VecMessage> = select_query
        .fetch_all(&data.db_pool)
        .await
        .expect("postgres selection error");
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به نظر می رسد که جادوی کتابخانه sqlx می تواند نوع ما را مرتب کند id!

یک لحظه شکرگزاری

با تشکر از شما، کسی که به طور تصادفی به این پست برخورد کرد و به آن نگاه کرد
من تازه شروع به کار کردم، پس در نظر داشته باشید که برای من بازخورد بگذارید.

آیا شما یک هموطنان روستایی هستید؟
آیا این مطلب به شما کمک کرد؟
دوست دارید به عنوان یک دستور پخت زنگ زده به چه مسائل دیگری مربوط به زنگ پرداخته شود؟

یادآوری – کد این پست در GitHub من وجود دارد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا