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:
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.
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.