Como utilizar o banco de dados SQLite3 no ORM da vlang

Photo by Dell on Unsplash

Como utilizar o banco de dados SQLite3 no ORM da vlang

A linguagem de programação V (vlang) fornece um ORM nativo e simples de utilizar.

Play this article

A linguagem de programação V (vlang) possui um ORM (Object Relational Mapper - Mapeamento objeto-relacional) nativo.

No artigo de hoje veremos como utilizar o mesmo com o banco de dados SQLite3.

Até o momento em que escrevo são suportados oficialmente os bancos de dados:


Dependências

Distribuições Linux

Arch Linux

sudo pacman -S \
sqlite

Chrome OS

sudo apt install \
libsqlite3-dev

Fedora

sudo dnf install \
sqlite-devel

openSUSE Tumbleweed

sudo zypper install \
sqlite3-devel

Ubuntu e derivados

sudo apt install \
libsqlite3-dev

Microsoft Windows

No Microsoft Windows é necessário baixar o arquivo sqlite-amalgamation contido na sessão Source Code da página de downloads do site do SQLite:

Baixando o conector do banco de dados SQLite3.

Assim que o download for concluído, descompacte o conteúdo no diretório:

C:\v\thirdparty\sqlite

📝 Se a pasta sqlite não existir crie a mesma.

Adicionando o conector do SQLite3 na pasta thirdparty da linguagem de programação v (vlang).


Código

/*
Vlang: Como utilizar o ORM com o banco de dados SQLite3.
*/

module main

import os
import db.sqlite

[table: 'user']
struct User {
    id   int    [primary; sql: serial]
    name string [nonull]
    age  int
}

fn count_users(db sqlite.DB) !int {
    return sql db {
        select count from User
    }!
}

fn table_exists(db sqlite.DB, table_name string) bool {
    query := 'SELECT name FROM sqlite_master WHERE type="table" AND name="${table_name}";'
    row, code := db.exec(query)
    if row.len == 0 {
        return false
    }
    return true
}

fn main() {
    database := os.resource_abs_path('db.sqlite3')
    if os.is_file(database) {
        os.rm(database)!
    }

    mut db := sqlite.connect(database)!
    db.synchronization_mode(sqlite.SyncMode.off)
    db.journal_mode(sqlite.JournalMode.memory)

    // [!] Criando tabela. [!]
    // Método 01.
    sql db {
        create table User
    }!

    // Método 02.
    // table_user_fields := [
    //     'id INTEGER PRIMARY KEY AUTOINCREMENT',
    //     'name TEXT NOT NULL',
    //     'age int',
    //     'gender string',
    // ]
    // db.create_table('user', table_user_fields)

    // [!] Create [!].
    println('\n[!] Create [!].')
    println('Total de usuários ANTES do insert: ${count_users(db)!}')
    // Método 01.
    user := User{
        name: 'renato'
        age: 39
    }
    sql db {
        insert user into User
    }!
    // Método 02.
    db.exec('INSERT INTO user (name, age) VALUES("rafaela", 18);')
    println('Total de usuários APÓS o insert: ${count_users(db)!}')

    // [!] Read [!].
    println('\n[!] Read [!].')
    // Consultando todos os usuários.
    // Método 01.
    rows := sql db {
        select from User
    }!
    for row in rows {
        println('ID: ${row.id}, Nome: ${row.name}, Idade: ${row.age}.')
    }

    // Método 02.
    // rows, _ := db.exec('SELECT * FROM user;')
    // for row in rows {
    //     println(row.vals)
    // }

    // Consulta com parâmetros específicos.
    filtered := sql db {
        select from User where name == 'renato' && age > 20
    }!

    // Método 02.
    // filtered, _ := db.exec(
    //     'SELECT * FROM user WHERE gender = "masculino" AND age > 20;',
    // )
    println('Usuário(s) com sexo "masculino" e idade > 20 = ${filtered.len}')

    // [!] Consulta com limit. [!]
    // Método 01.
    select_with_limit := sql db {
        select from User limit 1
    }!

    // Método 02.
    // select_with_limit, _ := db.exec('SELECT * FROM user LIMIT 1;')
    println('Consulta com limit (1) = ${select_with_limit.len}')

    // [!] Update [!].
    println('\n[!] Update [!].')
    // Método 01.
    current_user := sql db {
        select from User where id == 2
    }!
    println('Antes da atualização: ${current_user[0].name}')
    sql db {
        update User set name = 'gisele' where id == 2
    }!
    updated_user := sql db {
        select from User where id == 2
    }!
    println('Depois da atualização: ${updated_user[0].name}')

    // Método 02.
    // current_user := db.exec_one('SELECT name FROM user WHERE id = 2;')!
    // println('Antes da atualização: ${current_user.vals[0]}')
    // db.exec('UPDATE user SET name = "gisele" WHERE id = 2;')
    // updated_user := db.exec_one('SELECT name FROM user WHERE id = 2;')!
    // println('Depois da atualização: ${updated_user.vals[0]}')

    // [!] Delete [!].
    println('\n[!] Delete [!].')
    println('Total de usuários cadastrados ANTES do delete: ${count_users(db)!}')
    // Método 01.
    sql db {
        delete from User where id == 2
    }!

    // Método 02.
    // db.exec('DELETE FROM user WHERE id = 2;')
    println('Total de usuários cadastrados APÓS o delete: ${count_users(db)!}')

    db.close()!
}

📝 Todas as queries são automaticamente sanitizadas para prevenir SQL injection.


Extra

Softwares


Did you find this article valuable?

Support Renato Cruz by becoming a sponsor. Any amount is appreciated!