Observed since 20 Oct, 22:01 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
@04l3x4ndr3/microbase-orm
Um micro ORM em JavaScript ES6 inspirado no CodeIgniter 3 Query Builder com suporte para MySQL/MariaDB e PostgreSQL
Um micro ORM em JavaScript puro ES6 inspirado no Query Builder do CodeIgniter 3, com suporte completo para MySQL/MariaDB e PostgreSQL.
npm install 04l3x4ndr3/microbase-orm
npm install mysql2
npm install mariadb
npm install pg
nota : Embora sejam opcionais, pelo menos uma das dependências acima devem ser instalada.
npm install mysql2 pg mariadb
import Database from './Database.js';
// Configuração
const db = new Database({
driver: 'mysql', // ou 'postgres' ou 'mariadb'
host: 'localhost',
username: 'usuario',
password: 'senha',
database: 'meu_banco',
port: 3306 // ou 5432 para PostgreSQL
});
// Conectar
await db.connect();
// SELECT simples
const usuarios = await db.select('*').from('usuarios').get();
// Desconectar
await db.disconnect();
const config = {
driver: 'mysql',
host: 'localhost',
username: 'root',
password: 'senha',
database: 'meu_banco',
port: 3306
};
const config = {
driver: 'postgres',
host: 'localhost',
username: 'postgres',
password: 'senha',
database: 'meu_banco',
port: 5432
};
// Selecionar todos os campos
await db.select('*').from('usuarios').get();
// Selecionar campos específicos
await db.select(['nome', 'email']).from('usuarios').get();
// Selecionar com string
await db.select('nome, email').from('usuarios').get();
// Máximo
await db.selectMax('idade').from('usuarios').get();
await db.selectMax('idade', 'idade_maxima').from('usuarios').get();
// Mínimo
await db.selectMin('idade').from('usuarios').get();
// Média
await db.selectAvg('salario').from('usuarios').get();
// Soma
await db.selectSum('vendas').from('usuarios').get();
await db.select('cidade').distinct().from('usuarios').get();
// Igualdade simples
await db.select('*').from('usuarios').where('ativo', 1).get();
// Com operador
await db.select('*').from('usuarios').where('idade', 18, '>').get();
// Objeto de condições
await db.select('*').from('usuarios').where({ ativo: 1, cidade: 'São Paulo' }).get();
await db.select('*') .from('usuarios') .where('cidade', 'São Paulo') .orWhere('cidade', 'Rio de Janeiro') .get();
await db.select('*') .from('usuarios') .whereNotIn('status', ['bloqueado', 'suspenso']) .get();
await db.select('*') .from('usuarios') .whereNotLike('email', '%spam%') .get();
// INNER JOIN
await db.select('u.nome, p.descricao')
.from('usuarios u')
.join('perfis p', 'u.perfil_id = p.id') .get();
// LEFT JOIN
await db.select('u.nome, p.descricao')
.from('usuarios u')
.leftJoin('perfis p', 'u.perfil_id = p.id')
.get();
// RIGHT JOIN
await db.select('u.nome, p.descricao')
.from('usuarios u')
.rightJoin('perfis p', 'u.perfil_id = p.id')
.get();
await db.select(['cidade', 'COUNT(*) as total'])
.from('usuarios')
.groupBy('cidade').having('total', 10, '>')
.get();
// Múltiplos campos
await db.select(['cidade', 'estado', 'COUNT(*) as total'])
.from('usuarios')
.groupBy(['cidade', 'estado'])
.get();
// Ordenação simples
await db.select('*')
.from('usuarios')
.orderBy('nome', 'ASC')
.get();
// Múltiplas ordenações
await db.select('*')
.from('usuarios')
.orderBy('cidade', 'ASC')
.orderBy('nome', 'DESC')
.get();
// Ordenação aleatória
await db.select('*')
.from('usuarios')
.orderByRandom() .limit(5)
.get();
// Limit simples
await db.select('*')
.from('usuarios')
.limit(10)
.get();
// Limit com offset
await db.select('*')
.from('usuarios')
.limit(10, 20)
.get();
// Ou usando offset separadamente
await db.select('*')
.from('usuarios')
.limit(10)
.offset(20)
.get();
const resultados = await db.select('*').from('usuarios').get();
const usuario = await db.select('*').from('usuarios').where('id', 1).first();
const total = await db.select('*').from('usuarios').where('ativo', 1).count();
const usuarios = await db.getWhere('usuarios', { ativo: 1, cidade: 'São Paulo' });
// Insert simples
await db.insert('usuarios', { nome: 'João Silva', email: 'joao@email.com', ativo: 1 });
// Insert em lote
await db.insert('usuarios', [
{ nome: 'João', email: 'joao@email.com' },
{ nome: 'Maria', email: 'maria@email.com' },
{ nome: 'Pedro', email: 'pedro@email.com' }
]);
await db.replace('usuarios', { id: 1, nome: 'João Santos', email: 'joao.santos@email.com' });
// Update com WHERE
await db.update('usuarios', { nome: 'João Santos' }, { id: 1 } );
// Update usando query builder
await db.from('usuarios')
.where('ativo', 0)
.update('usuarios', { status: 'inativo' });
// Usando set()
await db.from('usuarios')
.set('nome', 'João Santos')
.set('email', 'joao.santos@email.com')
.where('id', 1)
.update('usuarios');
// Delete simples
await db.delete('usuarios', { id: 1 });
// Delete com query builder
await db.from('usuarios')
.where('ativo', 0)
.where('ultimo_login', '2023-01-01', '<')
.delete();
await db.emptyTable('logs'); // TRUNCATE TABLE
// Query SQL direta
const resultado = await db.query('SELECT * FROM usuarios WHERE id = ?', [1]);
const sql = db.select('*')
.from('usuarios')
.where('ativo', 1)
.getCompiledSelect();
console.log(sql); // SELECT * FROM `usuarios` WHERE `ativo` = ?
const relatorio = await db.select([
'u.nome',
'u.email',
'p.descricao as perfil',
'COUNT(v.id) as total_vendas',
'SUM(v.valor) as valor_total'
])
.from('usuarios u')
.leftJoin('perfis p', 'u.perfil_id = p.id')
.leftJoin('vendas v', 'u.id = v.usuario_id')
.where('u.ativo', 1)
.whereIn('u.cidade', ['São Paulo', 'Rio de Janeiro', 'Belo Horizonte'])
.groupBy(['u.id', 'u.nome', 'u.email', 'p.descricao'])
.having('total_vendas', 0, '>')
.orderBy('valor_total', 'DESC')
.limit(50)
.get();
await db.connect();
const connection = db.connection;
// Para MySQL
await connection.beginTransaction();
try {
await db.insert('usuarios', { nome: 'João' });
await db.insert('perfis', { usuario_id: 1, tipo: 'admin' });
await connection.commit();
} catch (error) {
await connection.rollback(); throw error;
}
// Criar um builder base
const usuariosAtivos = db.builder()
.from('usuarios')
.where('ativo', 1);
// Usar o builder base para diferentes consultas
const administradores = await usuariosAtivos
.where('perfil', 'admin')
.get();
const vendedores = await db.builder()
.from('usuarios')
.where('ativo', 1)
.where('perfil', 'vendedor')
.get();
projeto/
├── Database.js # Classe principal
├── QueryBuilder.js # Construtor de queries
├── database/
│ └── Connection.js # Gerenciador de conexões
├── drivers/
│ ├── MySQLDriver.js # Driver MySQL/MariaDB
│ └── PostgreSQLDriver.js # Driver PostgreSQL
└── examples/
└── usage.js # Exemplos de uso
// Teste de conexão
import Database from './Database.js';
async function testarConexao() {
const db = new Database({
driver: 'mysql',
host: 'localhost',
username: 'root',
password: 'senha',
database: 'teste'
});
try {
await db.connect();
console.log('✅ Conexão estabelecida com sucesso!');
const resultado = await db.query('SELECT 1 as teste');
console.log('✅ Query executada:', resultado);
} catch (error) {
console.error('❌ Erro:', error.message);
} finally {
await db.disconnect();
}
}
testarConexao();
git checkout -b feature/nova-feature)git commit -am 'Adiciona nova feature')git push origin feature/nova-feature)Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Nota: Este é um projeto educacional/experimental. Para uso em produção, considere ORMs estabelecidos como Sequelize, TypeORM ou Prisma.
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
mysql2Environment{
"local_name": "mysql2",
"alias": false,
"peer_metadata": null
} | ^3.6.5 | development |
mariadbEnvironment{
"local_name": "mariadb",
"alias": false,
"peer_metadata": null
} | ^3.4.2 | development |
pgEnvironment{
"local_name": "pg",
"alias": false,
"peer_metadata": null
} | ^8.11.3 | development |
mysql2Environment{
"local_name": "mysql2",
"alias": false,
"peer_metadata": {
"optional": true
}
} | ^3.6.5 | peer |
mariadbEnvironment{
"local_name": "mariadb",
"alias": false,
"peer_metadata": {
"optional": true
}
} | ^3.4.2 | peer |
pgEnvironment{
"local_name": "pg",
"alias": false,
"peer_metadata": {
"optional": true
}
} | ^8.11.3 | peer |
Source distribution
{
"integrity": "sha512-2syqmZYMKgtzld/vlhy/JtPIaoxX4HUs7q3a75v4VQalyEdeVrtPU7F3koiYASSHANBr67A1k96FwxOXCVahyg==",
"shasum": "cf2fc4eea07294099c127aa8d3521f9aa1d5cc60",
"tarball": "https://registry.npmjs.org/@04l3x4ndr3/microbase-orm/-/microbase-orm-2.2.2.tgz",
"fileCount": 10,
"unpackedSize": 130363,
"signatures": [
{
"keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U",
"sig": "MEUCIG2F3u2D2rBWIk41ChBpIwhJ2VbfDF1B33cjWDSUgvluAiEA7FHvnlcT0UacmFd2S9mrk5GdaL0xJ3dSuDi8tcxn+bA="
}
]
}Observed since 20 Oct, 22:01 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:4d40f3446a87c0db82bb58ea695e0a8fb2ccf144e6a07c4f16a68b4801ba4be8