Rust�Ńf�[�^�x�[�X�ɃA�N�Z�X���悤�FWeb�A�v�������Ŋw�ԁA����Ŗ𗧂�Rust����i15�j

�ŏI��ƂȂ��15��ł́ARust�ɂ�����f�[�^�x�[�X�V�X�e���̗��p���Љ�܂��B�����܂ł̃T���v���ł̓f�[�^�\�[�X��JSON�t�@�C����Web Storage�ł������A�����Ńf�[�^�\�[�X�Ƀf�[�^�x�[�X���g���悤�ɂ��ăA�v�����������܂��B

» 2024�N12��19�� 05��00�� ���J

���̋L���͉������ł��B����o�^�i�����j����ƑS�Ă������������܂��B

uWebAvŊwԁAŖ𗧂RustṽCfbNX

�A�ځFWeb�A�v�������Ŋw�ԁA����Ŗ𗧂�Rust����

�@�{�A�ڂ̃T���v���R�[�h��GitHub�Ō��J���Ă��܂��B����������_�E�����[�h���Ă݂Ă��������B


�f�[�^�x�[�X�̗��p

�@����́AWeb�A�v���̃f�[�^���f�[�^�x�[�X�ɕۑ�����悤�ɉ��ς��܂��B����܂ł́AWeb�A�v���̎d�g�݂ɏW�����邽�߂ɁA�f�[�^���e�L�X�g�t�@�C���ɕۑ����Ă��܂����B���p�I��Web�A�v���ł́A�p�t�H�[�}���X����S���Ȃǂ��l������΁A�f�[�^�x�[�X�ւ̕ۑ����K�{�ƂȂ�܂��B��11���ȂǂŒ񋟂��Ă����Aactix-web��Web�A�v���Ɏ������܂��B

�@Rust�ł́ASQL�n��NoSQL�n�̑o���ɂ‚��āA�f�[�^�x�[�X���p�̂��߂̃N���[�g���[�����Ă��܂��BSQL�n���ASQL�����L�q���Ē��ڃN�G���𔭍s����^�C�v�ƁAORM�i���L�̕⑫���Q�Ɓj�ɂ���ăf�[�^�x�[�X�ւ̃A�N�Z�X�𒊏ۉ�����^�C�v�Ȃǂɕ�����܂��B�f�[�^�x�[�X�ɕۑ�����f�[�^�̍\���╡�G���A�v���O���~���O�����ł̓����̗e�Ղ��Ȃǂ����Ă��āA�ǂ̃N���[�g�𗘗p���邩�����߂邱�ƂɂȂ�܂��B

�y�⑫�zORM

ORM�̓I�u�W�F�N�g�֌W�}�b�s���O�iObject-Relational Mapping�j�̗��ŁA�I�u�W�F�N�g�w���v���O���~���O�ƃ����[�V���i���f�[�^�x�[�X�Ԃ̌݊�������̂��߂̋Z�p�ł��BORM�ɂ́A�v���O���~���O����̃N���X�ƃf�[�^�x�[�X�̃e�[�u�����}�b�s���O���邱�ƂŁA�N�G���𒼐ڋL�q���Ȃ��Ƃ��f�[�^�x�[�X�𗘗p�ł���Ƃ��������b�g������܂��B

SQL�n�f�[�^�x�[�X�̃N���[�g

�@SQL�n�f�[�^�x�[�X�̍ŏ��̑I�����Ƃ��āASQLite�AMySQL�APostgreSQL�Ȃǂ�RDBMS�ɓ��������N���[�g�̗��p������܂��BSQLite�Ȃ�sqlite�AMySQL�Ȃ�mysql�APostgreSQL�Ȃ�postgres�Ƃ����悤�ɂ��̂��̃Y�o���̃N���[�g�ł��B���p����RDBMS�����܂��Ă���΁A�����͗L�͂ȑI�����ɂȂ�ł��傤�B������RDBMS�������I�ł���Ƃ��A�J���Ɩ{�ԂŊ‹����ς��Ƃ������ꍇ�ɂ́A���ɏЉ��SQLx���������ׂ��ł��B

�@SQLx�́A��ORM�^�C�v��SQL�f�[�^�x�[�X�N���[�g�ł��B�����ɁA�uSQLx is not an ORM!�v�Ƃ������Ă���悤�ɁAORM���T�|�[�g���܂���B���̂���SQL���̋L�q���K�v�ł����A�R���p�C�����ɃN�G���̐��������`�F�b�N����d�g�݂�������Ă��܂��B�����Ńe�[�u���ƍ\���̂̃t�B�[���h���o�C���h����ȂǁAORM�ł͂Ȃ��ł�������ɏ�����g������̗ǂ��������܂��B�񓯊������ɂ��Ή����Ă���A�񓯊������^�C����Tokio��Actix�ɑΉ�����ȂǁA���L���T�|�[�g�ƂȂ��Ă��܂��B

�@Diesel�́ARust�̂��߂�ORM�^�C�v�̃f�[�^�x�[�X�N���[�g�ł��B�o���2015�N��Rust�Ƃقڎ����𓯂��ɂ��Ă���A�����Ԃɂ킽��Rust�ɂ�����f�[�^�x�[�X�A�N�Z�X�̂��߂̃N���[�g�Ƃ��ė��p����Ă��܂��B�L�x�Ȏ��тƏ[�������@�\�������ł����A�d�l���c��ł����y�ɓ�������ɂ̓n�[�h���������悤�ł��B�܂��A�񓯊������ɑΉ����Ă��Ȃ��ȂǁA�p�t�H�[�}���X��v�������ꍇ�ɂ͓K���Ȃ��Ƃ�����_������܂��B

�@SeaORM���ARust�̂��߂�ORM�^�C�v�̃f�[�^�x�[�X�N���[�g�ł��B2021�N�̃����[�X��Diesel�ɒx��Ă̓o��ł����ASQLx������I�ɗ��p���Ă���̂Ŕ񓯊������ɑΉ����Ă���A���ꂪDiesel�ɑ΂���A�h�o���e�[�W�ƂȂ藘�p�҂�L�΂��Ă��܂��B

�y�⑫�z�񓯊������^�C��Tokio

Tokio�́ARust�ɂ�����񓯊����s�̂��߂̃��C�u�����ł��B�����^�C���Ɗ֐���񋟂��܂��BRust�ɂ�Future�Ƃ����񓯊����s�̃T�|�[�g������܂����A���s�Ɋւ��Ă͊O���̃����^�C���Ɉˑ����Ă��܂��B���̈�‚�Tokio�ł���Aasync-std��Actix�Ȃǂ��g���錻���_�ł��A���т̂���Tokio���g���邱�Ƃ������悤�ł��B

NoSQL�n�f�[�^�x�[�X�̃N���[�g

�@NoSQL�n�Ƃ��ẮAMongoDB�̂��߂�mongodb�ARedis�̂��߂�redis�ȂǁA���ɑO�҂�MongoDB�ɂ������̃h���C�o�ł���̂ŁANoSQL�n�f�[�^�x�[�X��Rust�Ŏg�������Ƃ����ꍇ�ɂ͗L�͂ȑI�����ł��傤�B

�@�{�L���ł́AGitHub��Star����Diesel�ɕC�G���A�����̕~������r�I�ႭActix�ɂ��Ή����Ă���Ȃǂ̗��R�ŁASQLx�ɂ��f�[�^�x�[�X�A�N�Z�X�����グ�܂��B���p����RDBMS���A���炩���߃C���X�g�[���A�K�v�ȃZ�b�g�A�b�v���ς܂��Ă����Ă��������B�Ȃ��A�{�L���ł̓f�[�^�x�[�X��SQLite�𗘗p����Ƃ��ĉ����i�߂܂��BMySQL��PostgreSQL�𗘗p����ꍇ�ɂ‚��ẮA�K�v�ɉ����Č��y���܂��B

SQLx���p�̂��߂̏���

�@SQLx�����p����ɂ́ACLI�c�[���isqlx-cli�j���C���X�g�[�����Ă����ƕ֗��ł��Bcargo install�R�}���h�ɂāA�ȉ��̂悤��CLI�c�[�����C���X�g�[�����܂��B--features�I�v�V�����ŁASQLite���g�����Ƃ𖾎����Ă��܂��B

% cargo install sqlx-cli --no-default-features --features sqlite

�@SQLite���g���ꍇ�ɂ́Asqlx database create�R�}���h�Ńf�[�^�x�[�X���쐬���Ă����܂��B���炩���߁A�v���W�F�N�g�̃��[�g�iactix-posts�j�Ɉړ����Ă����Ă��������B�f�[�^�x�[�X�t�@�C������database.db�Ƃ��āA--database-url�I�v�V�����Ŏw�肵�܂��B�܂��A�‹��ϐ�DATABASE_URL��ݒ肵�Ă����Ă������ł��B

% sqlx database create --database-url "sqlite:./database.db"

�@�Ȃ��A�f�[�^�x�[�X���폜����ɂ́Asqlx database drop�R�}���h�����s���܂��B

�}�C�O���[�V��������

�@�����āA�}�C�O���[�V�����p�̃t�@�C�����쐬���܂��B�}�C�O���[�V�����Ƃ́A�f�[�^�x�[�X�̃X�L�[�}�i�\���j��V���̃o�[�W�����Ԃňڍs�����邱�Ƃ������܂��B�����ł́A�e�[�u���������Ȃ���ԂɁA���炩�̃e�[�u����lj�����A���邢�͂��̋t�Ƒ�����΂悢�ł��傤�B�}�C�O���[�V�����́Asqlx migrate add�R�}���h�Œlj����܂��B-r�I�v�V�������w�肷��ƁA�o�[�W�����A�b�v�ɉ����Č��ɖ߂����߂̃t�@�C�����쐬����܂��B�܂��A�����Ŏw�肷��create_posts_table�́A�e�[�u�����쐬����i�폜����j�}�C�O���[�V�����ł��邱�Ƃ��Ӗ����Ă��܂��B

% sqlx migrate add -r create_posts_table 
Creating migrations/20241110044413_create_posts_table.up.sql
Creating migrations/20241110044413_create_posts_table.down.sql

�@�}�C�O���[�V�����t�@�C���́A�쐬�����migrations�t�H���_�ɒu����܂��B�����ł͏ڂ����G��܂��񂪁A�}�C�O���[�V�����t�@�C���ɂ͓������܂܂�邱�Ƃɒ��ӂ��Ă��������B����ɂ���āA�}�C�O���[�V�����̎��n�񂪊Ǘ�����܂��B

�@�쐬���ꂽ�t�@�C���̓R�����g�s�݂̂Ŏ����I�ɋ�Ȃ̂ŁA�}�C�O���[�V�����̖ړI�ł���e�[�u���쐬��DDL�������X�g1�̂悤�ɋL�q���܂��Bid����L�[�Ƃ��āA���̑��̃t�B�[���h�ɑS�Ĕ�NULL�����t�^���܂��B

CREATE TABLE posts (
    id INTEGER PRIMARY KEY,
    posted DATETIME NOT NULL,
    sender TEXT NOT NULL,
    content TEXT NOT NULL
);
���X�g1�Fmigrations/20241110044413_create_posts_table.up.sql

�@���ɖ߂����߂̃t�@�C���ɂ��A�e�[�u���폜��DDL�����L�q���Ă����܂��i���X�g2�j�B

DROP TABLE posts;
���X�g2�Fmigrations/20241110044413_create_posts_table.down.sql

�@�t�@�C���������ł�����Asqlx migrate run�R�}���h�Ń}�C�O���[�V���������s���܂��Brun�́A�o�[�W�����A�b�v�̃}�C�O���[�V���������s����T�u�R�}���h�ł��B

% sqlx migrate run --database-url sqlite:./database.db 
Applied 20241110044413/migrate create posts table (539.545µs)

�@�uApplied�c�v�Əo�͂����΁A�e�[�u���͍쐬����Ă��܂��B������ASQLite��CLI�c�[���ł���sqlite3�R�}���h�Ŋm���߂Ă݂܂��傤�Bpragma table_info(posts)�R�}���h�̎��s�ŁA�e�t�B�[���h���o�͂����ΐ����ł��B

% sqlite3 database.db 
SQLite version 3.43.2 2023-10-10 13:08:14
Enter ".help" for usage hints.
sqlite> .tables					�e�[�u���̕\��
_sqlx_migrations  posts
sqlite> pragma table_info(posts);		�X�L�[�}�̕\��
0|id|INTEGER|0||1
1|posted|DATETIME|1||0
2|sender|TEXT|1||0
3|content|TEXT|1||0
sqlite> .q					�I��

�@���ɖ߂��Ƃ��̃R�}���h�͈ȉ��̂悤�ɂȂ�܂��B�e�[�u�����������čŏ������蒼���ۂɗL�p�ł��B

% sqlx migrate revert --database-url sqlite:./database.db 

�����f�[�^��o�^����

�@����܂ł̉�Ɠ��l�ɁA�����f�[�^��o�^���Ă����܂��B�ŏ��Ɉꗗ�\���ɂĊ�{�I�ȓ�����m�F�ł���悤�ɂ��邽�߂ł��B�����f�[�^�́ACSV�`���Ń��X�g3�̂悤�ɗp�ӂ��܂��B

id,posted,sender,content
1,2024-11-09 01:23:45,Nao,����ɂ��́B\n�܂�Rust����Ă܂��B\n�v���Ԃ�Ȃ̂ŋ�J���Ă܂��B
2,2024-11-10 12:34:56,Shino,����͂����l�ł��B\n����Rust�����ς�ł��B
3,2024-11-11 22:33:44,Yuutan,Rust�ʔ��������I\n���΂��قǂ͂܂�����B
���X�g3�Fseed.csv

�@�����f�[�^�́A�ȉ��̂悤��sqlite3�R�}���h�Ŏ�荞�߂܂��B

% sqlite3 ./database.db
SQLite version 3.43.2 2023-10-10 13:08:14
Enter ".help" for usage hints.
sqlite> .mode csv				CSV���[�h�ɐ؂�ւ�
sqlite> .import seed.csv posts --skip 1		�擪�s���X�L�b�v���ăC���|�[�g
sqlite> select * from posts;			��荞�݌��ʂ��m�F
1,"2024-11-09 01:23:45",Nao,"����ɂ��́B\n�܂�Rust����Ă܂��B\n�v���Ԃ�Ȃ̂ŋ�J���Ă܂��B"
2,"2024-11-10 12:34:56",Shino,"����͂����l�ł��B\n����Rust�����ς�ł��B"
3,"2024-11-11 22:33:44",Yuutan,"Rust�ʔ��������I\n���΂��قǂ͂܂�����B"
sqlite> .q					�I��

Actix Web�A�v���ւ̓���

�@��������AWeb�A�v���Ƀf�[�^�x�[�X�𓱓����āAWeb API��Ή������܂��B

�ˑ��֌W��lj�����

�@�A�v����SQLx���g����悤�ɁA�ˑ��֌W��lj����܂��B

% cargo add sqlx --features "sqlite runtime-tokio chrono"
% cargo add dotenv

�@cargo add sqlx�R�}���h��--features�I�v�V�����́A�f�[�^�x�[�X��sqlite�A�񓯊������^�C����tokio�A�����Ǘ���chrono�A���ꂼ��𗘗p����w��ƂȂ��Ă��܂��B���̃f�[�^�x�[�X���g���ꍇ�ɂ́Amysql�Apostgresql�Asqlserver�ȂǂɕύX���܂��B

�@dotenv�́APython�ARuby�Ȃǂł��p������‹��ϐ��̂��߂̃��C�u�����ł��B.env�t�@�C���Ɋ‹��ϐ����L�q���Ă����������荞�ނ��Ƃ��ł���̂ŁA�‹��ϐ����‹����ƂɎg�����������Ƃ��Ȃǂɕ֗��ł��B�����ł́A�v���W�F�N�g�̃��[�g��.env�t�@�C����p�ӂ��A������DATABASE_URL�‹��ϐ����L�q���Ă������Ƃɂ��܂��i���X�g4�j�B

DATABASE_URL=sqlite:./database.db
���X�g4�F.env

�@�‹��ϐ�DATABASE_URL�́A�f�[�^�x�[�X���ƂɈȉ��̂悤�ɐݒ�ł��܂��B���[�U�[���A�p�X���[�h�A�z�X�g���A�|�[�g�ԍ��A�f�[�^�x�[�X���͎��ۂ̊‹��ɍ��킹��K�v������܂��B

DATABASE_URL=sqlite:./database.db                                    SQLite
DATABASE_URL=mysql://mysql:password@localhost:3306/database          MySQL
DATABASE_URL=postgres://postgres:password@localhost:5432/database    PostgrSQL

�f�[�^�x�[�X�ڑ��v�[���𓱓�����

�@�f�[�^�x�[�X�𗘗p����ɂ́A�܂��ڑ��v�[�����A�v���ɓ������܂��B�ڑ��v�[���Ƃ́A��ʓI�ɂ̓R�l�N�V�����ƌĂ΂����̂ŁA�v�͐ڑ����Ǘ�����I�u�W�F�N�g�ł��i���X�g5�j�B

// ���O��Ԃ���荞��
use dotenv;
use sqlx::sqlite::SqlitePool;
use std::env;
�c���c
#[actix_rt::main]
async fn main() -> Result<()> {
  �c���c
  // (1)�‹��ϐ�DATABASE_URL�̎擾�Ɛڑ��v�[���̍쐬
  dotenv::dotenv().expect(".env�̓ǂݍ��ݎ��s");	// .env�̓ǂݍ���
  let database_url = env::var("DATABASE_URL")		// DATABASE_URL�̎擾
    .expect("DATABASE_URL���Z�b�g����Ă��܂���");
  let pool = SqlitePool::connect(&database_url).await.unwrap();	// �ڑ��v�[���̍쐬
  HttpServer::new(move || {
    let tera = Tera::new("templates/**/*.html").unwrap();
    App::new()
    .app_data(web::Data::new(tera))
    // (2)���[�e�B���O�ɐڑ��v�[����o�^����
    .app_data(web::Data::new(pool.clone()))
    �c���c
    // (3)�f�[�^�x�[�X��API��o�^����
    .service(
      web::scope("/api/db")
        .service(handler::api_index_db)
        .default_service(web::to(handler::api_not_found))
      )
      �c���c
���X�g5�Fsrc/main.rs

�@�‹��ϐ�DATABASE_URL���擾���A��������ڑ��v�[�����쐬���鏈�����i1�j�ł��Bdotenv::dotenv()�̌Ăяo���ŁA.env�t�@�C������‹��ϐ����擾���A�Z�b�g���܂��Benv::var()�̌Ăяo���ŃZ�b�g���ꂽ�‹��ϐ����擾���܂��B�����ꂩ�����s����΃v���O�������I�����܂��BSqlitePool::connect()���\�b�h�ɐڑ��������n�����ƂŁA�ڑ��v�[�����쐬����܂��B

�@�쐬���ꂽ�ڑ��v�[���́A���[�e�B���O�ŌĂяo�����n���h���[�֐��Ŏ󂯎���K�v������̂ŁAweb::Data�\���̂Ƀ��b�v�����ڑ��v�[�����Aapp_data���\�b�h�ɂēo�^���܂��Bapp_data���\�b�h�̓����ɂ‚��ẮA��3������4���ŏЉ�Ă���̂ŁA��������Q�Ƃ��Ă��������B

�@�Ō�ɁA�f�[�^�x�[�X�ł�API�ƂȂ�n���h���[�֐������[�e�B���O�ɓo�^���܂��Bservice���\�b�h�̎g��������3���ŁAscope���\�b�h�̎g��������6���ŏЉ�Ă���̂ŁA��������Q�Ƃ��Ă��������B�����ł́A"/api"���O��"/api/db"��o�^���Ă��邱�Ƃɒ��ӂ��Ă��������B

�n���h���[�֐��Őڑ��v�[�����󂯎��

�@�n���h���[�֐��ł́A�ڑ��v�[�����󂯎���ăf�[�^�A�N�Z�X�֐����Ăяo���܂��B���X�g6�́A�S���擾�̊֐�api_index_withdb�ł��B

use sqlx::sqlite::Sqlite;
use sqlx::pool::Pool;
#[get("/posts")]
// (1)������web::Data�\���̂�lj����Đڑ��v�[�����󂯎��
pub async fn api_index_withdb(pool: web::Data<Pool<Sqlite>>, 
    query: web::Query<Queries>) -> impl Responder {
  let param = query.into_inner();
  // (2)�ڑ��v�[�������o���ăf�[�^�x�[�X�A�N�Z�X�֐����Ăяo��
  let pool = pool.get_ref();
  let posts = data::get_all_db(pool.clone()).await;
  // (3)�ȍ~�̓t�@�C���łƓ����Ȃ̂ŏȗ�
  let mut ary = Vec::new();
  �c���c
}
���X�g6�Fsrc/handler.rs

�@�n���h���[�֐��ł́A�i1�j�̂悤��app_data���\�b�h�Œlj����ꂽweb::Data�\���̂��󂯎��܂��B�i2�j�ł́A���b�v���Ă���Pool<Sqlite>�\���̂ւ̎Q�Ƃ�get_ref���\�b�h�Ŏ��o���Adata::get_all_withdb���\�b�h�ɗ^���Ă��܂��B���̃��\�b�h�͌�q���܂����A�f�[�^�x�[�X�ł̈ꗗ�擾�֐��ł��Bawait���t���Ă���̂́A���̊֐��͔񓯊��֐��Ƃ��č쐬���邩��ł��B

�@�i3�j�ȍ~�́A�t�@�C���łƓ����ł��B�z�z�T���v�����Q�Ƃ��Ă��������B

�f�[�^�x�[�X�ɃA�N�Z�X����i�Q�ƌn�j

�@��L��data::get_all_withdb�֐��́Adata.rs�t�@�C���Ƀt�@�C���łƓ����悤�ɋL�q���܂��i���X�g7�j�B

use sqlx::sqlite::Sqlite;
use sqlx::pool::Pool;
// (1)�f�[�^�x�[�X�p�̍\���̂�p��
#[derive(Debug, Clone)]
pub struct Post {
  pub id: i64,                // ID  
  pub posted: NaiveDateTime,  // ���e����
  pub sender: String,         // ���e�Җ�
  pub content: String,        // ���e���e
}
// (2)�f�[�^�x�[�X�ł̈ꗗ�擾�֐�
pub async fn get_all_withdb(pool: Pool<Sqlite>) -> Vec<Message> {
  // (3)�N�G���̍쐬�Ɣ��s
  let posts = sqlx::query_as!(
    Post,
    "select id, posted, sender, content from posts order by posted desc"
  )
  .fetch_all(&pool)
  .await.unwrap();
  // (4)Vec<Post>����Vec<Message>���쐬���ĕԂ�
  let mut messages: Vec<Message> = Vec::new();
  for post in posts {
    let message = Message {id: post.id as i32, posted: post.posted.to_string(), sender: post.sender, content: post.content};
      messages.push(message);
  }
  messages
}
���X�g7�Fsrc/handler/data.rs

�@�f�[�^�x�[�X�ɂ�posts�e�[�u�����쐬���܂������A���̃e�[�u����Message�\���̂ƌ݊���������܂���i�����t�B�[���h�Ȃǂ��܂ނ��߁j�B���̂��߁A�i1�j�̂悤�ɕʂ�Post�\���̂��`���A���݂Ƀt�B�[���h��ϊ����Ă��Ƃ肵�܂��B

�@�f�[�^�x�[�X�ł̈ꗗ�擾�֐�get_all_withdb���i2�j�ł��BSQLx�̊֐��͔񓯊��ł���̂ŁA�񓯊��֐��ƂȂ��Ă��܂��B�����ɁA�n���h���[�֐�����n�����ڑ��v�[�����󂯎��܂��B

�@�N�G���𐶐����Ĕ��s���Ă���̂��i3�j�ł��BSQLx�ɂ̓N�G�����s�̕��@����‚�����A�傫�������ă}�N�����g�����֐����g�����Aquery���g����query_as���g�����̌v4�p�^�[���ɕ�����܂��B�����ł́A���S�ɃN�G�����ʂ��\���̂Ƀ}�b�v�ł���query_as!�}�N���̗�������܂��B

�@query_as!�}�N���́A�����̍\���̂̃t�B�[���h�ƃN�G�������񒆂̃t�B�[���h���������Ή����Ă��邩�ǂ����A�^���܂߂ăr���h���Ƀ`�F�b�N���܂��B�Ⴆ��SQLite�̏ꍇ�A��ȃt�B�[���h�̌^�i�Ƃ��̐���j��Rust�ɂ�����^�͕\1�̂悤�ɑΉ����܂��B

SQLite�^ Rust�^ ���l
integer i64 i32�Ȃǂ͎g�p�ł��Ȃ�
text not null String NULL�łȂ����Ƃ��ۏ؂���Ă���̂�
text Option<String> NULL�ł���ꍇ�ɂ�None�ƂȂ�
datetime chrono::NativeDateTime ���t�����Ǘ���chrono���w�肵���ꍇ
�\1�FSQLite�̌^��Rust�̌^�̑Ή�

�@�^�̕s��v������΃R���p�C���G���[�ƂȂ�̂ŁA���݂��Ȃ��t�B�[���h��^�������Ă��Ȃ������Ƃ����󋵂����O�ɉ���ł��܂��B

�f�[�^�x�[�X�ɃA�N�Z�X����i�X�V�n�j

�@�X�V�n�����Ă݂܂��傤�i���X�g8�j�B

pub async fn create_withdb(pool: Pool<Sqlite>, mut message: Message) -> Message {
  // Message��Post�ɕϊ�����
  let post = Post {
    id: 0, 
    posted: NaiveDateTime::parse_from_str(&message.posted, "%Y-%m-%d %H:%M:%S").unwrap(), 
    sender: message.sender.clone(), content: message.content.clone()};
  // (1)query!�}�N���ŃN�G���𔭍s
  let result = sqlx::query!(
    "insert into posts(posted, sender, content) values (?, ?, ?)",
    post.posted, post.sender, post.content)
  .execute(&pool)
  .await.unwrap();
  // (2)�}�����R�[�h��id���Z�b�g���ĕԂ�
  message.id = result.last_insert_rowid() as i32;
  message
}
���X�g8�Fsrc/handler/data.rs

�@�X�V�n�ł́A���ʂ��\���̂Ƀ}�b�v����K�v���Ȃ��̂ŁAquery_as!�}�N���ɑւ��query!�}�N�����g���܂��B�i1�j�̂悤�Ɋ�{�I�Ȏg�����͓����ł����A�}�N���̈����ɍ\���̂��Ȃ����ƁAfetch�n���\�b�h�ł͂Ȃ�execute���\�b�h���g�����Ƃ��قȂ�܂��B�܂��A�N�G�����p�����[�^�[���܂ނ̂ŁA�������}�N���̈����Ɋ܂߂Ă��܂��B

�@�i2�j�ł́A�N�G�����ʂ���last_insert_rowid���\�b�h���Ăяo���č쐬�������R�[�h��id���擾���A�֐��̖߂�l�Ɋ܂߂Ă��܂��B�Ȃ��APostgreSQL�ł�returning���Ō��ʂ�Ԃ����Ƃ��ł���̂ŁA���̏ꍇ��query_as!�}�N�����g���Č��ʂ��}�b�v����΁A���l�̏����ƂȂ�܂��B�܂��A�N�G���p�����[�^�[��$1, $2�c�c�ƂȂ�܂��B

�@���̑���API�n���h���[���\�b�h��f�[�^�x�[�X�A�N�Z�X�֐��ɂ‚��ẮA�z�z�T���v�����Q�Ƃ��Ă��������B�܂��A�A�v�����N������curl�R�}���h�Ȃǂ��烊�N�G�X�g�𔭍s���ē�����m�F���Ă݂Ă��������B

�܂Ƃ�

�@����́ARust�ɂ�����f�[�^�x�[�X�V�X�e���̗��p���Љ�܂����B�ɂ߂ėe�ՂɁA������Rust�Ȃ�ł͂̈��S�����������f�[�^�x�[�X�A�N�Z�X���ł��邱�Ƃ����`���ł����̂ł͂Ȃ����Ǝv���܂��B

�@����ɂāAWeb�A�v���J����ʂ���Rust�̊��p�@���Љ��{�A�ڂ͏I���ƂȂ�܂��B�ǎ҂ɁA����Ȃ�����l����ꂽRust�ɂ��Web�A�v���J���̖��͂������ł����`���ł����Ȃ�K���ł��B

�M�ҏЉ�

WINGS�v���W�F�N�g

�L����� WINGS�v���W�F�N�g���^�c����A�e�N�j�J�����M�R�~���j�e�B�[�i��\�R�c�ˊ��j�B���Web�J������̏��Ё^�L�����M�A�|��A�u�����𕝍L����|����B2021�N10�����_�ł̓o�^�����o�[��55�l�ŁA���݂����M�����o�[���W���B�����̂�����́A�ǂ��ǂ����咸�������B�����A�L�������B

�E�T�[�o�[�T�C�h�Z�p�̊w�ю� - WINGS�ihttps://wings.msn.to/�j
�ERSS�ihttps://wings.msn.to/contents/rss.php�j
�EX: @WingsPro_info�ihttps://x.com/WingsPro_info�j
�EFacebook�ihttps://www.facebook.com/WINGSProject�j


Copyright © ITmedia, Inc. All Rights Reserved.

'; if( !this.isSubscription ) { this.insertTarget = document.querySelector('#cmsBody .subscription') || document.querySelector('#cmsBody .inner'); } }; BodyAdIMSWithCCE.prototype = Object.create(BodyAdContent.prototype); BodyAdIMSWithCCE.prototype.activate = function () { refreshGam('InArtSpecialLink'); } // global reference window.itm = itm; //entry point BodyAdEventBase.polyfill(); const bodyAdManager = BodyAdManager.getInstance(); bodyAdManager.addEventListener(BodyAdManager.EVENTS.READY, function (ev) { bodyAdManager.loadAdvertise(); }); bodyAdManager.init(); })();
�X�|���T�[����̂��m�点PR

���ڂ̃e�[�}

Microsoft  WindowsőO2025
AI for GWjAO
[R[h^m[R[h Zg by IT - ITGWjArWlX̒SŊ􂷂gD
Cloud Native Central by IT - XP[uȔ\͂gD
�V�X�e���J���m�E�n�E �y�����i�r�zPR
���Ȃ��ɂ������߂̋L��PR

RSS�ɂ‚���

�A�C�e�B���f�B�AID�ɂ‚���

���[���}�K�W���o�^

��IT�̃��[���}�K�W���́A �������A���ׂĖ����ł��B���Ѓ��[���}�K�W�������w�ǂ��������B