{"_id":"@aetherframework/database","_rev":"9-97d78290211ab400f96ff5bf1ad1af91","name":"@aetherframework/database","dist-tags":{"latest":"1.1.2"},"versions":{"1.0.9":{"name":"@aetherframework/database","version":"1.0.9","keywords":["database","multi-database","query-builder","connection-pool","mysql","postgresql","redis","mongodb","sqlite","mssql","oracle","zero-dependency","aetherjs","orm","driver"],"author":{"name":"Aether Framework Team"},"license":"MIT","_id":"@aetherframework/database@1.0.9","maintainers":[{"name":"aetherframework","email":"aetherjs@outlook.com"}],"homepage":"https://github.com/aetherframework-database#readme","bugs":{"url":"https://github.com/aetherframework-database/issues","email":"support@aetherjs.org"},"dist":{"shasum":"23234bb4f5d9928628f4ed25a428ea197087b6f3","tarball":"https://registry.npmjs.org/@aetherframework/database/-/database-1.0.9.tgz","fileCount":48,"integrity":"sha512-IyR7HlF/NRwG6qy9OGs9xN6oysMVXQcTd1HszCshVy2Vc685IG85q/5cCkGrzFwGWunBG1hs7I8FxkXUeGxEpQ==","signatures":[{"sig":"MEYCIQC4qu7zQmnJBBC519cMxjR0GlhfXElDYoxH5vSAmmm3vwIhAL5igV8VGJfueA1Kdg+v7QoV86hte64m4vwQvk/W7L/c","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":582276},"main":"index.js","type":"module","types":"types.js","engines":{"node":">=18.0.0"},"_npmUser":{"name":"aetherframework","email":"aetherjs@outlook.com"},"repository":{"url":"https://github.com/aetherframework-database.git","type":"git"},"_npmVersion":"10.9.3","description":"Zero-dependency, multi-database integration for AetherJS API framework with advanced query builder and connection pooling","directories":{},"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","jsdoc":"^4.0.0","prettier":"^3.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/database_1.0.9_1780652733186_0.2939011877285773","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aetherframework/database","version":"1.1.0","keywords":["database","multi-database","query-builder","connection-pool","mysql","postgresql","redis","mongodb","sqlite","mssql","oracle","zero-dependency","aetherjs","orm","driver"],"author":{"name":"Aether Framework Team"},"license":"MIT","_id":"@aetherframework/database@1.1.0","maintainers":[{"name":"aetherframework","email":"aetherjs@outlook.com"}],"homepage":"https://github.com/aetherframework-database#readme","bugs":{"url":"https://github.com/aetherframework-database/issues","email":"support@aetherjs.org"},"dist":{"shasum":"487659c4272e0c79b63c846a62ea048c2f30d461","tarball":"https://registry.npmjs.org/@aetherframework/database/-/database-1.1.0.tgz","fileCount":5,"integrity":"sha512-SeUd4V/DgJqLhHUHO/blEJJ+U2OgmN2cgshUq1z5kb/K6Rm1kWV7TtD6zVVKVU0MGTduJuB0O8GRrfRA/FI07w==","signatures":[{"sig":"MEQCIDFlIDu5VxO7tLgd/PnjOK2pEtMhzKFXrB0iJSm47ncrAiB4TkntQsafwI3Zej+tOBzw++lWkhpUv4L3Y5Z+kmJY1A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29632},"main":"index.js","type":"module","types":"types.js","engines":{"node":">=18.0.0"},"_npmUser":{"name":"aetherframework","email":"aetherjs@outlook.com"},"repository":{"url":"https://github.com/aetherframework-database.git","type":"git"},"_npmVersion":"10.9.3","description":"Zero-dependency, multi-database integration for AetherJS API framework with advanced query builder and connection pooling","directories":{},"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","jsdoc":"^4.0.0","prettier":"^3.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/database_1.1.0_1780931847148_0.3775630234213083","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@aetherframework/database","version":"1.1.1","keywords":["database","multi-database","query-builder","connection-pool","mysql","postgresql","redis","mongodb","sqlite","mssql","oracle","zero-dependency","aetherjs","orm","driver"],"author":{"name":"Aether Framework Team"},"license":"MIT","_id":"@aetherframework/database@1.1.1","maintainers":[{"name":"aetherframework","email":"aetherjs@outlook.com"}],"homepage":"https://github.com/aetherframework-database#readme","bugs":{"url":"https://github.com/aetherframework-database/issues","email":"support@aetherjs.org"},"dist":{"shasum":"dcbae8a0ad32f3a79b18a3b70dcc25f8a2e270ce","tarball":"https://registry.npmjs.org/@aetherframework/database/-/database-1.1.1.tgz","fileCount":5,"integrity":"sha512-FhndMNzXloPcmowkrQUeTK9Wi0/pdTvu8lRNgja3b5eAlMf6GUp9b7pgCE0LxgvuL8uLnDTJkO1oBpv18PTQbQ==","signatures":[{"sig":"MEYCIQDWIGjHwNWaFThOdWAzq2ket3kgA+3SEyDaGtF+Dzv4WgIhAMR08zX0P6fXu1G9+rbbopBjwVMZFNDTQskNRpyWHQCb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29632},"main":"index.js","type":"module","types":"types.js","engines":{"node":">=18.0.0"},"_npmUser":{"name":"aetherframework","email":"aetherjs@outlook.com"},"repository":{"url":"https://github.com/aetherframework-database.git","type":"git"},"_npmVersion":"10.9.3","description":"Zero-dependency, multi-database integration for AetherJS API framework with advanced query builder and connection pooling","directories":{},"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","jsdoc":"^4.0.0","prettier":"^3.0.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/database_1.1.1_1780933464066_0.47017642433769","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@aetherframework/database","version":"1.1.2","description":"Zero-dependency, multi-database integration for AetherJS API framework with advanced query builder and connection pooling","main":"index.js","type":"module","types":"types.js","author":{"name":"Aether Framework Team"},"license":"MIT","keywords":["database","multi-database","query-builder","connection-pool","mysql","postgresql","redis","mongodb","sqlite","mssql","oracle","zero-dependency","aetherjs","orm","driver"],"devDependencies":{"@types/node":"^20.0.0","jest":"^29.0.0","jsdoc":"^4.0.0","prettier":"^3.0.0"},"engines":{"node":">=18.0.0"},"repository":{"type":"git","url":"https://github.com/aetherframework-database.git"},"bugs":{"url":"https://github.com/aetherframework-database/issues","email":"support@aetherjs.org"},"homepage":"https://github.com/aetherframework-database#readme","_id":"@aetherframework/database@1.1.2","_nodeVersion":"22.18.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-fFqzoa5LBV7QIfGHMm+5TQbKDR14vwrT7xL01N3ciOfVfgZ3XR4wnOom9TZ1bQp0YzJaz2W1Ws2ELwVvRQyt2g==","shasum":"095eb93839b7987ed98b6b770771170bec49e6da","tarball":"https://registry.npmjs.org/@aetherframework/database/-/database-1.1.2.tgz","fileCount":51,"unpackedSize":637693,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFqD6dGgwwfT5c38J3++LW2gyvem6wXDpUAr5WgTt9W+AiATv0Or3+xv7g/XKH91hUIAXNKsYkfvqBl38n4zLIDyfA=="}]},"_npmUser":{"name":"aetherframework","email":"aetherjs@outlook.com"},"directories":{},"maintainers":[{"name":"aetherframework","email":"aetherjs@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/database_1.1.2_1780933639769_0.29043932816630935"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-05T09:45:33.054Z","modified":"2026-06-08T15:47:20.094Z","1.0.4":"2026-06-04T15:47:47.113Z","1.0.6":"2026-06-05T09:37:49.958Z","1.0.7":"2026-06-05T09:40:40.485Z","1.0.9":"2026-06-05T09:45:33.338Z","1.1.0":"2026-06-08T15:17:27.283Z","1.1.1":"2026-06-08T15:44:24.213Z","1.1.2":"2026-06-08T15:47:19.952Z"},"bugs":{"url":"https://github.com/aetherframework-database/issues","email":"support@aetherjs.org"},"author":{"name":"Aether Framework Team"},"license":"MIT","homepage":"https://github.com/aetherframework-database#readme","keywords":["database","multi-database","query-builder","connection-pool","mysql","postgresql","redis","mongodb","sqlite","mssql","oracle","zero-dependency","aetherjs","orm","driver"],"repository":{"type":"git","url":"https://github.com/aetherframework-database.git"},"description":"Zero-dependency, multi-database integration for AetherJS API framework with advanced query builder and connection pooling","maintainers":[{"name":"aetherframework","email":"aetherjs@outlook.com"}],"readme":"AetherFramework Database - Zero-Dependency Multi-Database Integration for Node.js\r\n\r\n🚀 Why Choose AetherFramework Database?\r\n\r\nAetherFramework Database is a revolutionary database integration solution designed specifically for the AetherJS API framework, but flexible enough to work with any Node.js application. In a world of bloated dependencies and complex ORMs, we offer a refreshing alternative that prioritizes performance, simplicity, and developer experience.\r\n\r\n📊 Key Advantages Over Other Solutions\r\n\r\n| Feature | AetherFramework Database | TypeORM | Sequelize | Knex.js | Prisma |\r\n|---------|-----------------------------|---------|-----------|---------|--------|\r\n| Zero Dependencies | ✅ No external dependencies | ❌ 50+ dependencies | ❌ 40+ dependencies | ❌ 15+ dependencies | ❌ 100+ dependencies |\r\n| Bundle Size | ✅ ~100KB | ❌ ~10MB | ❌ ~8MB | ❌ ~2MB | ❌ ~20MB |\r\n| Multi-Database Support | ✅ 8+ databases unified API | ✅ 7+ databases | ✅ 6+ databases | ✅ 7+ databases | ✅ 5+ databases |\r\n| Built-in Features | ✅ Pooling, Caching, Monitoring, Migrations | ❌ Requires plugins | ❌ Requires plugins | ❌ Basic only | ❌ Limited |\r\n| TypeScript Support | ✅ First-class with full types | ✅ Excellent | ✅ Good | ✅ Basic | ✅ Excellent |\r\n| Learning Curve | ✅ Gentle, intuitive API | 🔴 Complex | 🟡 Moderate | 🟢 Simple | 🔴 Complex |\r\n| Performance | ✅ Native speed, no overhead | 🟡 Good | 🟡 Good | 🟢 Excellent | 🟢 Good |\r\n\r\n\r\n📦 Installation\r\n\r\n```bash\r\nUsing npm\r\nnpm install @aetherframework/database\r\n```\r\n\r\n🚀 Quick Start\r\n\r\nWith AetherJS\r\n\r\n```javascript\r\n// In your AetherJS project\r\nimport { Database } from '@aetherframework/database';\r\n\r\n// Minimal configuration\r\nconst db = new Database({\r\n  connections: {\r\n    primary: {\r\n      type: 'sqlite',\r\n      database: './data/app.db'\r\n    }\r\n  }\r\n});\r\n\r\n// Initialize\r\nawait db.init();\r\n\r\n// Start using immediately\r\nconst users = await db.table('users').select('*').execute();\r\nconsole.log(users.rows);\r\n```\r\n\r\nWith Express.js\r\n\r\n```javascript\r\nimport express from 'express';\r\nimport { Database } from '@aetherframework/database';\r\n\r\nconst app = express();\r\nconst db = new Database({\r\n  connections: {\r\n    primary: {\r\n      type: 'mysql',\r\n      host: 'localhost',\r\n      user: 'root',\r\n      password: 'password',\r\n      database: 'myapp'\r\n    }\r\n  }\r\n});\r\n\r\nawait db.init();\r\n\r\napp.get('/users', async (req, res) => {\r\n  const users = await db.table('users').select('*').execute();\r\n  res.json(users.rows);\r\n});\r\n\r\napp.listen(3000, () => {\r\n  console.log('Server running with @aetherframework/database');\r\n});\r\n```\r\n\r\nWith Fastify\r\n\r\n```javascript\r\nimport Fastify from 'fastify';\r\nimport { Database } from '@aetherframework/database';\r\n\r\nconst fastify = Fastify();\r\nconst db = new Database({\r\n  connections: {\r\n    primary: {\r\n      type: 'postgresql',\r\n      host: 'localhost',\r\n      user: 'postgres',\r\n      password: 'password',\r\n      database: 'myapp'\r\n    }\r\n  }\r\n});\r\n\r\nawait db.init();\r\n\r\nfastify.get('/users', async (request, reply) => {\r\n  const users = await db.table('users').select('*').execute();\r\n  return users.rows;\r\n});\r\n\r\nfastify.listen({ port: 3000 }, (err) => {\r\n  if (err) throw err;\r\n  console.log('Fastify server running with @aetherframework/database');\r\n});\r\n```\r\n\r\nWith NestJS\r\n\r\n```javascript\r\n// database.module.ts\r\nimport { Module } from '@nestjs/common';\r\nimport { Database } from '@aetherframework/database';\r\n\r\n@Module({\r\n  providers: [\r\n    {\r\n      provide: 'DATABASE',\r\n      useFactory: async () => {\r\n        const db = new Database({\r\n          connections: {\r\n            primary: {\r\n              type: 'mysql',\r\n              host: 'localhost',\r\n              user: 'root',\r\n              password: 'password',\r\n              database: 'myapp'\r\n            }\r\n          }\r\n        });\r\n        await db.init();\r\n        return db;\r\n      }\r\n    }\r\n  ],\r\n  exports: ['DATABASE']\r\n})\r\nexport class DatabaseModule {}\r\n\r\n// users.service.ts\r\nimport { Injectable, Inject } from '@nestjs/common';\r\n\r\n@Injectable()\r\nexport class UsersService {\r\n  constructor(@Inject('DATABASE') private db) {}\r\n\r\n  async findAll() {\r\n    return await this.db.table('users').select('*').execute();\r\n  }\r\n}\r\n```\r\n\r\n📚 Basic Usage Guide\r\n\r\n1. Simple Configuration\r\n\r\n```javascript\r\nimport { Database } from '@aetherframework/database';\r\n\r\n// Basic setup for a single database\r\nconst db = new Database({\r\n  connections: {\r\n    primary: {\r\n      type: 'sqlite', // or 'mysql', 'postgresql', 'mongodb', 'redis'\r\n      database: './data/myapp.db' // SQLite file path\r\n    }\r\n  }\r\n});\r\n\r\nawait db.init();\r\n```\r\n\r\n2. Creating Tables\r\n\r\n```javascript\r\n// Create a simple users table\r\nawait db.query(`\r\n  CREATE TABLE IF NOT EXISTS users (\r\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n    name TEXT NOT NULL,\r\n    email TEXT UNIQUE NOT NULL,\r\n    age INTEGER,\r\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\r\n  )\r\n`);\r\n```\r\n\r\n3. Basic CRUD Operations\r\n\r\nCreate (Insert)\r\n\r\n```javascript\r\n// Insert a single record\r\nconst result = await db.table('users')\r\n  .insert({\r\n    name: 'John Doe',\r\n    email: 'john@example.com',\r\n    age: 30\r\n  })\r\n  .execute();\r\n\r\nconsole.log(`Inserted user with ID: ${result.lastID}`);\r\n\r\n// Insert multiple records\r\nconst batchResult = await db.table('users')\r\n  .insert([\r\n    { name: 'Alice', email: 'alice@example.com', age: 25 },\r\n    { name: 'Bob', email: 'bob@example.com', age: 35 },\r\n    { name: 'Charlie', email: 'charlie@example.com', age: 28 }\r\n  ])\r\n  .execute();\r\n\r\nconsole.log(`Inserted ${batchResult.affectedRows} users`);\r\n```\r\n\r\nRead (Select)\r\n\r\n```javascript\r\n// Get all users\r\nconst allUsers = await db.table('users').select('*').execute();\r\nconsole.log(`Total users: ${allUsers.rows.length}`);\r\n\r\n// Get specific columns\r\nconst names = await db.table('users')\r\n  .select('id', 'name', 'email')\r\n  .execute();\r\n\r\n// Get with conditions\r\nconst adults = await db.table('users')\r\n  .select('*')\r\n  .where('age', '>=', 18)\r\n  .execute();\r\n\r\n// Get with multiple conditions\r\nconst activeUsers = await db.table('users')\r\n  .select('*')\r\n  .where('age', '>=', 18)\r\n  .where('status', '=', 'active')\r\n  .execute();\r\n\r\n// Get with OR conditions\r\nconst specificUsers = await db.table('users')\r\n  .select('*')\r\n  .where('name', '=', 'John')\r\n  .orWhere('name', '=', 'Jane')\r\n  .execute();\r\n\r\n// Get with ordering and limits\r\nconst recentUsers = await db.table('users')\r\n  .select('*')\r\n  .orderBy('created_at', 'desc')\r\n  .limit(10)\r\n  .execute();\r\n\r\n// Get single record\r\nconst user = await db.table('users')\r\n  .where('id', '=', 1)\r\n  .first();\r\n```\r\n\r\nUpdate\r\n\r\n```javascript\r\n// Update single record\r\nconst updateResult = await db.table('users')\r\n  .where('id', '=', 1)\r\n  .update({\r\n    name: 'John Updated',\r\n    age: 31\r\n  })\r\n  .execute();\r\n\r\nconsole.log(`Updated ${updateResult.affectedRows} user(s)`);\r\n\r\n// Update multiple records\r\nconst bulkUpdate = await db.table('users')\r\n  .where('status', '=', 'inactive')\r\n  .update({ status: 'active' })\r\n  .execute();\r\n\r\n// Increment/decrement values\r\nawait db.table('users')\r\n  .where('id', '=', 1)\r\n  .increment('login_count', 1)\r\n  .execute();\r\n\r\nawait db.table('users')\r\n  .where('id', '=', 2)\r\n  .decrement('balance', 100)\r\n  .execute();\r\n```\r\n\r\nDelete\r\n\r\n```javascript\r\n// Delete single record\r\nconst deleteResult = await db.table('users')\r\n  .where('id', '=', 1)\r\n  .delete()\r\n  .execute();\r\n\r\nconsole.log(`Deleted ${deleteResult.affectedRows} user(s)`);\r\n\r\n// Delete with conditions\r\nawait db.table('users')\r\n  .where('status', '=', 'banned')\r\n  .where('last_login', '<', new Date('2023-01-01'))\r\n  .delete()\r\n  .execute();\r\n```\r\n\r\n4. Working with Different Databases\r\n\r\nMySQL\r\n\r\n```javascript\r\nconst mysqlDB = new Database({\r\n  connections: {\r\n    primary: {\r\n      type: 'mysql',\r\n      host: 'localhost',\r\n      port: 3306,\r\n      user: 'root',\r\n      password: 'password',\r\n      database: 'myapp',\r\n      charset: 'utf8mb4'\r\n    }\r\n  }\r\n});\r\n```\r\n\r\nPostgreSQL\r\n\r\n```javascript\r\nconst pgDB = new Database({\r\n  connections: {\r\n    primary: {\r\n      type: 'postgresql',\r\n      host: 'localhost',\r\n      port: 5432,\r\n      user: 'postgres',\r\n      password: 'password',\r\n      database: 'myapp',\r\n      ssl: false\r\n    }\r\n  }\r\n});\r\n```\r\n\r\nSQLite\r\n\r\n```javascript\r\nconst sqliteDB = new Database({\r\n  connections: {\r\n    primary: {\r\n      type: 'sqlite',\r\n      database: './data/app.db' // File path\r\n      // or ':memory:' for in-memory database\r\n    }\r\n  }\r\n});\r\n```\r\n\r\nMongoDB\r\n\r\n```javascript\r\nconst mongoDB = new Database({\r\n  connections: {\r\n    primary: {\r\n      type: 'mongodb',\r\n      host: 'localhost',\r\n      port: 27017,\r\n      database: 'myapp',\r\n      // Optional authentication\r\n      username: 'admin',\r\n      password: 'password'\r\n    }\r\n  }\r\n});\r\n\r\n// MongoDB specific operations\r\nconst users = await mongoDB.collection('users')\r\n  .find({ age: { $gt: 18 } })\r\n  .sort({ name: 1 })\r\n  .limit(10)\r\n  .execute();\r\n```\r\n\r\nRedis\r\n\r\n```javascript\r\nconst redisDB = new Database({\r\n  connections: {\r\n    cache: {\r\n      type: 'redis',\r\n      host: 'localhost',\r\n      port: 6379,\r\n      // Optional authentication\r\n      password: 'password',\r\n      db: 0,\r\n      keyPrefix: 'myapp:'\r\n    }\r\n  }\r\n});\r\n\r\n// Redis operations\r\nawait redisDB.getConnection('cache').set('user:1', JSON.stringify(user));\r\nconst cachedUser = await redisDB.getConnection('cache').get('user:1');\r\n```\r\n\r\n5. Simple Joins and Relationships\r\n\r\n```javascript\r\n// Basic join\r\nconst usersWithOrders = await db.table('users')\r\n  .select('users.*', 'orders.total_amount')\r\n  .join('orders', 'users.id', '=', 'orders.user_id')\r\n  .execute();\r\n\r\n// Left join\r\nconst allUsersWithOrders = await db.table('users')\r\n  .select('users.*', 'orders.total_amount')\r\n  .leftJoin('orders', 'users.id', '=', 'orders.user_id')\r\n  .execute();\r\n\r\n// Multiple joins\r\nconst detailedData = await db.table('users')\r\n  .select(\r\n    'users.name',\r\n    'orders.order_number',\r\n    'products.name as product_name',\r\n    'order_items.quantity'\r\n  )\r\n  .join('orders', 'users.id', '=', 'orders.user_id')\r\n  .join('order_items', 'orders.id', '=', 'order_items.order_id')\r\n  .join('products', 'order_items.product_id', '=', 'products.id')\r\n  .where('users.status', '=', 'active')\r\n  .execute();\r\n```\r\n\r\n6. Aggregation Functions\r\n\r\n```javascript\r\n// Count records\r\nconst userCount = await db.table('users').count().execute();\r\nconsole.log(`Total users: ${userCount.rows.count}`);\r\n\r\n// Count with condition\r\nconst activeUsers = await db.table('users')\r\n  .where('status', '=', 'active')\r\n  .count()\r\n  .execute();\r\n\r\n// Sum values\r\nconst totalSales = await db.table('orders')\r\n  .where('status', '=', 'completed')\r\n  .sum('amount')\r\n  .execute();\r\n\r\n// Average values\r\nconst avgAge = await db.table('users').avg('age').execute();\r\n\r\n// Minimum and maximum\r\nconst youngest = await db.table('users').min('age').execute();\r\nconst oldest = await db.table('users').max('age').execute();\r\n\r\n// Group by\r\nconst salesByMonth = await db.table('orders')\r\n  .select(\r\n    db.raw('YEAR(created_at) as year'),\r\n    db.raw('MONTH(created_at) as month'),\r\n    db.raw('SUM(amount) as total_sales')\r\n  )\r\n  .where('status', '=', 'completed')\r\n  .groupBy('year', 'month')\r\n  .orderBy('year', 'desc')\r\n  .orderBy('month', 'desc')\r\n  .execute();\r\n```\r\n\r\n7. Simple Transactions\r\n\r\n```javascript\r\n// Basic transaction\r\ntry {\r\n  const result = await db.transaction(async (trx) => {\r\n    // Insert user\r\n    const user = await trx.table('users')\r\n      .insert({\r\n        name: 'John',\r\n        email: 'john@example.com'\r\n      })\r\n      .execute();\r\n\r\n    // Insert user profile\r\n    await trx.table('profiles')\r\n      .insert({\r\n        user_id: user.lastID,\r\n        bio: 'Software Developer'\r\n      })\r\n      .execute();\r\n\r\n    return user;\r\n  });\r\n\r\n  console.log('Transaction completed:', result);\r\n} catch (error) {\r\n  console.error('Transaction failed:', error);\r\n}\r\n```\r\n\r\n8. Error Handling\r\n\r\n```javascript\r\ntry {\r\n  const result = await db.table('users')\r\n    .where('id', '=', 999)\r\n    .first();\r\n  \r\n  if (!result) {\r\n    console.log('User not found');\r\n  }\r\n} catch (error) {\r\n  console.error('Database error:', {\r\n    message: error.message,\r\n    code: error.code,\r\n    sql: error.sql,\r\n    params: error.params\r\n  });\r\n  \r\n  // Handle specific error types\r\n  if (error.code === 'ER_DUP_ENTRY') {\r\n    console.log('Duplicate entry error');\r\n  } else if (error.code === 'ER_NO_SUCH_TABLE') {\r\n    console.log('Table does not exist');\r\n  }\r\n}\r\n```\r\n\r\n9. Connection Management\r\n\r\n```javascript\r\n// Check connection status\r\nconst health = await db.getAllHealthChecks();\r\nconsole.log('Database health:', health);\r\n\r\n// Get connection statistics\r\nconst stats = db.getMetrics();\r\nconsole.log('Query statistics:', {\r\n  totalQueries: stats.totalQueries,\r\n  successfulQueries: stats.successfulQueries,\r\n  failedQueries: stats.failedQueries,\r\n  avgQueryTime: stats.avgQueryTime\r\n});\r\n\r\n// Close connections when done\r\nawait db.close();\r\nconsole.log('Database connections closed');\r\n```\r\n\r\n🔧 Common Patterns\r\n\r\n1. Pagination\r\n\r\n```javascript\r\nasync function getUsers(page = 1, limit = 10) {\r\n  const offset = (page - 1) * limit;\r\n  \r\n  const users = await db.table('users')\r\n    .select('*')\r\n    .orderBy('created_at', 'desc')\r\n    .limit(limit)\r\n    .offset(offset)\r\n    .execute();\r\n  \r\n  const total = await db.table('users').count().execute();\r\n  \r\n  return {\r\n    data: users.rows,\r\n    pagination: {\r\n      page,\r\n      limit,\r\n      total: total.rows.count,\r\n      pages: Math.ceil(total.rows.count / limit)\r\n    }\r\n  };\r\n}\r\n```\r\n\r\n2. Search Functionality\r\n\r\n```javascript\r\nasync function searchUsers(query, filters = {}) {\r\n  let builder = db.table('users').select('*');\r\n  \r\n  // Search in multiple fields\r\n  if (query) {\r\n    builder = builder.where(function(qb) {\r\n      qb.where('name', 'LIKE', `%${query}%`)\r\n        .orWhere('email', 'LIKE', `%${query}%`)\r\n        .orWhere('bio', 'LIKE', `%${query}%`);\r\n    });\r\n  }\r\n  \r\n  // Apply filters\r\n  if (filters.status) {\r\n    builder = builder.where('status', '=', filters.status);\r\n  }\r\n  \r\n  if (filters.minAge) {\r\n    builder = builder.where('age', '>=', filters.minAge);\r\n  }\r\n  \r\n  if (filters.maxAge) {\r\n    builder = builder.where('age', '<=', filters.maxAge);\r\n  }\r\n  \r\n  // Order and paginate\r\n  const result = await builder\r\n    .orderBy(filters.sortBy || 'created_at', filters.sortOrder || 'desc')\r\n    .limit(filters.limit || 20)\r\n    .offset(filters.offset || 0)\r\n    .execute();\r\n  \r\n  return result.rows;\r\n}\r\n```\r\n\r\n3. Batch Operations\r\n\r\n```javascript\r\n// Batch insert with validation\r\nasync function batchCreateUsers(users) {\r\n  const validUsers = users.filter(user => \r\n    user.name && user.email && user.age > 0\r\n  );\r\n  \r\n  if (validUsers.length === 0) {\r\n    return { success: false, message: 'No valid users to insert' };\r\n  }\r\n  \r\n  try {\r\n    const result = await db.table('users')\r\n      .insert(validUsers)\r\n      .execute();\r\n    \r\n    return {\r\n      success: true,\r\n      inserted: result.affectedRows,\r\n      skipped: users.length - validUsers.length\r\n    };\r\n  } catch (error) {\r\n    console.error('Batch insert failed:', error);\r\n    return { success: false, error: error.message };\r\n  }\r\n}\r\n```\r\n\r\n⚙️ Configuration Examples\r\n\r\nMinimal Configuration\r\n\r\n```javascript\r\nconst minimalConfig = {\r\n  connections: {\r\n    primary: {\r\n      type: 'sqlite',\r\n      database: './data/app.db'\r\n    }\r\n  }\r\n};\r\n```\r\n\r\nProduction Configuration\r\n\r\n```javascript\r\nconst productionConfig = {\r\n  enabled: true,\r\n  crossDb: true,\r\n  default: 'primary',\r\n  \r\n  connections: {\r\n    primary: {\r\n      type: 'mysql',\r\n      host: process.env.DB_HOST,\r\n      port: parseInt(process.env.DB_PORT),\r\n      user: process.env.DB_USER,\r\n      password: process.env.DB_PASSWORD,\r\n      database: process.env.DB_NAME,\r\n      charset: 'utf8mb4',\r\n      timezone: '+00:00',\r\n      pool: {\r\n        min: 2,\r\n        max: 10,\r\n        idleTimeout: 30000,\r\n        acquireTimeout: 10000\r\n      }\r\n    },\r\n    cache: {\r\n      type: 'redis',\r\n      host: process.env.REDIS_HOST,\r\n      port: parseInt(process.env.REDIS_PORT),\r\n      password: process.env.REDIS_PASSWORD,\r\n      db: 0,\r\n      keyPrefix: 'app:'\r\n    }\r\n  },\r\n  \r\n  driverModules: {\r\n    mysql: true,\r\n    redis: true,\r\n    sqlite: false,\r\n    postgres: false,\r\n    mongodb: false,\r\n    mssql: false,\r\n    oracle: false\r\n  },\r\n  \r\n  middleware: {\r\n    queryLogger: {\r\n      enabled: process.env.NODE_ENV !== 'production',\r\n      logLevel: 'info',\r\n      slowQueryThreshold: 1000\r\n    },\r\n    connectionPool: {\r\n      enabled: true,\r\n      maxConnections: 10,\r\n      minConnections: 2\r\n    },\r\n    queryCache: {\r\n      enabled: true,\r\n      ttl: 300000\r\n    }\r\n  }\r\n};\r\n```\r\n\r\n🔄 Migration from Other Libraries\r\n\r\nFrom Knex.js\r\n\r\n```javascript\r\n// Knex.js\r\nknex('users').where('id', 1).first();\r\n\r\n// @aetherframework/database\r\ndb.table('users').where('id', '=', 1).first();\r\n```\r\n\r\nFrom Sequelize\r\n\r\n```javascript\r\n// Sequelize\r\nUser.findAll({ where: { status: 'active' } });\r\n\r\n// @aetherframework/database\r\ndb.table('users').where('status', '=', 'active').execute();\r\n```\r\n\r\nFrom TypeORM\r\n\r\n```javascript\r\n// TypeORM\r\nuserRepository.find({ where: { age: MoreThan(18) } });\r\n\r\n// @aetherframework/database\r\ndb.table('users').where('age', '>', 18).execute();\r\n```\r\n\r\n🏆 Best Practices\r\n\r\n1. Always use parameterized queries - Prevents SQL injection\r\n2. Close connections when done - Prevents connection leaks\r\n3. Use transactions for multiple operations - Ensures data consistency\r\n4. Enable query logging in development - Helps with debugging\r\n5. Use connection pooling in production - Improves performance\r\n6. Implement proper error handling - Graceful degradation\r\n7. Use TypeScript for type safety - Catches errors at compile time\r\n\r\n🔧 Troubleshooting\r\n\r\nCommon Issues\r\n\r\n1. Connection refused\r\n   ```javascript\r\n   // Check your connection settings\r\n   const db = new Database({\r\n     connections: {\r\n       primary: {\r\n         type: 'mysql',\r\n         host: 'localhost', // Make sure this is correct\r\n         port: 3306,        // Default MySQL port\r\n         user: 'root',      // Check username\r\n         password: 'password', // Check password\r\n         database: 'myapp'  // Database must exist\r\n       }\r\n     }\r\n   });\r\n   ```\r\n\r\n2. Table doesn't exist\r\n   ```javascript\r\n   // Create the table first\r\n   await db.query(`\r\n     CREATE TABLE IF NOT EXISTS users (\r\n       id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n       name TEXT NOT NULL\r\n     )\r\n   `);\r\n   ```\r\n\r\n3. Slow queries\r\n   ```javascript\r\n   // Enable query logging to identify slow queries\r\n   const db = new Database({\r\n     middleware: {\r\n       queryLogger: {\r\n         enabled: true,\r\n         slowQueryThreshold: 100 // Log queries slower than 100ms\r\n       }\r\n     }\r\n   });\r\n   ```\r\n\r\n🚀 Next Steps\r\n\r\nOnce you're comfortable with the basics, explore these advanced features:\r\n\r\n1. Query Caching - Improve performance with built-in caching\r\n2. Performance Monitoring - Track and optimize query performance\r\n3. Database Migrations - Version control for your database schema\r\n4. Multiple Database Connections - Work with different databases simultaneously\r\n5. Custom Drivers - Extend support for other database systems\r\n\r\n\r\n📄 License\r\n\r\nMIT © AetherJS Team","readmeFilename":"README.md"}