PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 25 → Exemplo Crud com PostgreSQL feito com a linguagem Rust
Exemplo Crud com PostgreSQL feito com a linguagem Rust
Started by Boller, Apr., 10 2025 1:44 PM - No answer
Registered member
4,520 messages
Posted on April, 10 2025 - 1:44 PM
Vou criar um exemplo de CRUD (Create, Read, Update, Delete) em Rust para uma tabela de clientes usando o framework Diesel para interação com banco de dados PostgreSQL. Este é um exemplo funcional básico:
1 Primeiro, crie um novo projeto Rust:
cargo new clientes_crud --bin
cd clientes_crud
2 Atualize o Cargo.toml com as dependências necessárias:
[package]
name = "clientes_crud"
version = "0.1.0"
edition = "2021"

[dependencies]
diesel = { version = "2.1.0", features = ["postgres"] }
dotenvy = "0.15"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
3 Crie um arquivo .env na raiz do projeto:
DATABASE_URL=postgres://username:password@localhost/clientes_db
4 Crie o arquivo src/models.rs:
use diesel::prelude::*;
use serde::{Serialize, Deserialize};

#[derive(Queryable, Insertable, Serialize, Deserialize)]
#[diesel(table_name = crate::schema::clientes)]
pub struct Cliente {
pub id: i32,
pub nome: String,
pub cpf: String,
}

#[derive(Insertable, Deserialize)]
#[diesel(table_name = crate::schema::clientes)]
pub struct NovoCliente {
pub nome: String,
pub cpf: String,
}
5 Crie o arquivo src/schema.rs:
diesel::table! {
clientes (id) {
id -> Int4,
nome -> Varchar,
cpf -> Varchar,
}
}
6 Crie o arquivo src/main.rs com o CRUD completo:
use diesel::prelude::*;
use diesel::pg::PgConnection;
use dotenvy::dotenv;
use std::env;
use self::models::{Cliente, NovoCliente};

mod models;
mod schema;

pub fn establish_connection() -> PgConnection {
dotenv().ok();

let database_url = env::var("DATABASE_URL")
.expect("DATABASE_URL must be set");
PgConnection::establish(&database_url)
.expect(&format!("Error connecting to {}", database_url))
}

// CREATE
fn create_cliente(conn: &mut PgConnection, nome: &str, cpf: &str) -> Cliente {
use crate::schema::clientes;

let novo_cliente = NovoCliente {
nome: nome.to_string(),
cpf: cpf.to_string(),
};

diesel::insert_into(clientes::table)
.values(&novo_cliente)
.get_result(conn)
.expect("Error saving new cliente")
}

// READ (todos)
fn list_clientes(conn: &mut PgConnection) -> Vec {
use crate::schema::clientes::dsl::*;

clientes
.load::(conn)
.expect("Error loading clientes")
}

// READ (por id)
fn get_cliente(conn: &mut PgConnection, cliente_id: i32) -> Option {
use crate::schema::clientes::dsl::*;

clientes
.filter(id.eq(cliente_id))
.first(conn)
.optional()
.expect("Error loading cliente")
}

// UPDATE
fn update_cliente(conn: &mut PgConnection, cliente_id: i32, nome: &str, cpf: &str) -> Cliente {
use crate::schema::clientes::dsl::*;

diesel::update(clientes.filter(id.eq(cliente_id)))
.set((nome.eq(nome), cpf.eq(cpf)))
.get_result(conn)
.expect("Error updating cliente")
}

// DELETE
fn delete_cliente(conn: &mut PgConnection, cliente_id: i32) -> usize {
use crate::schema::clientes::dsl::*;

diesel::delete(clientes.filter(id.eq(cliente_id)))
.execute(conn)
.expect("Error deleting cliente")
}

fn main() {
let mut conn = establish_connection();

// Exemplo de uso do CRUD

// Create
let novo_cliente = create_cliente(&mut conn, "João Silva", "123.456.789-00");
println!("Cliente criado: {} - {}", novo_cliente.nome, novo_cliente.cpf);

// Read (todos)
let clientes = list_clientes(&mut conn);
println!("Lista de clientes:");
for cliente in clientes {
println!("ID: {}, Nome: {}, CPF: {}", cliente.id, cliente.nome, cliente.cpf);
}

// Read (por id)
if let Some(cliente) = get_cliente(&mut conn, novo_cliente.id) {
println!("Cliente encontrado: {} - {}", cliente.nome, cliente.cpf);
}

// Update
let cliente_atualizado = update_cliente(&mut conn, novo_cliente.id, "João Silva Atualizado", "987.654.321-00");
println!("Cliente atualizado: {} - {}", cliente_atualizado.nome, cliente_atualizado.cpf);

// Delete
let deleted_rows = delete_cliente(&mut conn, novo_cliente.id);
println!("Linhas deletadas: {}", deleted_rows);
}
7 Crie a migration para o banco de dados. Primeiro, instale o CLI do Diesel:
cargo install diesel_cli --no-default-features --features postgres
8 Configure o Diesel e crie a migration:
diesel setup
diesel migration generate create_clientes
9 Edite o arquivo de migration gerado em migrations/[timestamp]_create_clientes/up.sql:
CREATE TABLE clientes (
id SERIAL PRIMARY KEY,
nome VARCHAR NOT NULL,
cpf VARCHAR NOT NULL
)
10 E o down.sql:
DROP TABLE clientes;
11 Execute a migration:
diesel migration run
Para executar o projeto:
cargo run
Este código implementa:
• Create: Adiciona novos clientes
• Read: Lista todos os clientes ou busca por ID
• Update: Atualiza informações de um cliente existente
• Delete: Remove um cliente pelo ID
Características importantes:
• Usa Diesel como ORM para PostgreSQL
• Inclui tratamento básico de erros
• Usa variáveis de ambiente para configuração do banco
• Implementa serialização/deserialização com Serde
• Estrutura modular com separação de modelos e schema
Para usar com outro banco de dados, você precisaria ajustar as dependências e o schema SQL correspondente. Certifique-se de ter o PostgreSQL instalado e configurado com as credenciais corretas no arquivo .env.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/