数据库简介
AdonisJS
是少数几个对 SQL
数据库提供一流支持的 Node.js
框架之一(如果不是唯一的话)。 Lucid
为框架的数据层提供支持,您必须单独安装包。
// title: 安装
npm i @adonisjs/lucid
// title: 配置
node ace configure @adonisjs/lucid
# CREATE: config/database.ts
# UPDATE: .env,.env.example
# UPDATE: tsconfig.json { types += "@adonisjs/lucid" }
# UPDATE: .adonisrc.json { commands += "@adonisjs/lucid/build/commands" }
# UPDATE: .adonisrc.json { providers += "@adonisjs/lucid" }
// title: 验证环境变量
/**
* 根据您使用的数据库驱动程序,您必须验证
* 定义的环境变量。
*
* 以下是 PostgreSQL 的示例。
*/
export default Env.rules({
PG_HOST: Env.schema.string({ format: 'host' }),
PG_PORT: Env.schema.number(),
PG_USER: Env.schema.string(),
PG_PASSWORD: Env.schema.string.optional(),
PG_DB_NAME: Env.schema.string(),
})
- 支持多个 SQL 数据库。 PostgreSQL, MySQL, MSSQL, MariaDB 和 SQLite.
- 建立在 Knex.js 之上的查询构建起
- 基于 Active Record 的数据模型
- 迁移系统
- 模型工厂和数据库填充
配置
所有数据库驱动程序的配置都存储在 config/database.ts
文件中。
import Env from '@ioc:Adonis/Core/Env'
import { DatabaseConfig } from '@ioc:Adonis/Lucid/Database'
const databaseConfig: DatabaseConfig = {
// 默认连接
connection: Env.get('DB_CONNECTION'),
// 可用连接列表
connections: {
pg: {
client: 'pg',
connection: {
host: Env.get('PG_HOST'),
port: Env.get('PG_PORT'),
user: Env.get('PG_USER'),
password: Env.get('PG_PASSWORD', ''),
database: Env.get('PG_DB_NAME'),
},
migrations: {
naturalSort: true,
},
healthCheck: false,
debug: false,
},
}
}
export default databaseConfig
默认连接
connection
属性定义用于进行数据库查询的默认连接。该值依赖于 DB_CONNECTION
环境。
连接
connections
对象定义了一个或多个要在应用程序中使用的数据库连接,您可以使用相同或不同的数据库驱动程序定义多个连接。
迁移
migrations
属性配置数据库迁移的设置,它接受以下选项。
选项 | 说明 |
---|---|
naturalSort | 使用自然排序对迁移文件进行排序,大多数编辑器使用自然排序,因此迁移将按照您在编辑器中看到的顺序运行。 |
paths |
查找迁移的一系列路径。您还可以定义安装包的路径。例如:
|
tableName | 用于存储迁移状态的表的名称,默认为 adonis_schema . |
disableRollbacksInProduction | 在生产环境中禁用迁移回滚,建议您永远不要在生产环境中回滚迁移。 |
disableTransactions | 将该值设置为 true 以不在事务中包装迁移语句,默认情况下,Lucid 将在自己的事务中运行每个迁移文件。 |
健康检查
启用/禁用运行状况检查的布尔值。
调试
全局启用查询调试的布尔值。您必须阅读 调试指南 了解更多信息。
seeders
seeders
对象允许您定义加载数据库种子文件的路径。您还可以指定已安装包的路径。例如:
{
seeders: {
paths: ['./database/seeders', '@somepackage/seeders-dir']
}
}
用法
进行 SQL 查询的最简单方法是使用数据库查询生成器。它允许您使用 JavaScript 方法构造简单和复杂的 SQL 查询。
在以下示例中,我们从posts
表中选择所有帖子。
import Database from '@ioc:Adonis/Lucid/Database'
import Route from '@ioc:Adonis/Core/Route'
Route.get('posts', async () => {
return Database.from('posts').select('*')
})
让我们按他们的 id 对帖子进行排序,并对它们进行分页。
import Database from '@ioc:Adonis/Lucid/Database'
import Route from '@ioc:Adonis/Core/Route'
Route.get('posts', async ({ request }) => {
const limit = 20
const page = request.input('page', 1)
return Database
.from('posts')
.select('*')
.orderBy('id', 'desc') // 👈 先获取最新的
.paginate(page, limit) // 👈 使用页码分页
})
您不仅限于选择查询。您还可以使用查询生成器执行更新、插入和删除。
插入新行
const postId = await Database
.table('posts')
.insert({
title: 'Adonis 101',
description: 'Let\'s learn AdonisJS'
})
.returning('id') // 对于 PostgreSQL
按 id 更新现有行
const updatedRowsCount = await Database
.from('posts')
.where('id', 1)
.update({ title: 'AdonisJS 101' })
按 id 删除现有行
const deletedRowsCount = await Database
.from('posts')
.where('id', 1)
.delete()
读写分离
AdonisJS 支持 读写分离,你可以配置一台写数据库与多台读数据库,所有读查询都会以 循环方式 查询读数据库,写入则使用写数据库。
注:Lucid 不会为你执行任何数据复制,所以必须依赖你的数据库服务器。
以下是用于定义读/写连接的示例配置。我们将 connection
对象中定义的属性与读/写连接的每个节点合并。因此,你可以在连接对象中保留共享的 「用户名」和「密码」。
{
connections: {
mysql: {
connection: {
user: Env.get('MYSQL_USER'),
password: Env.get('MYSQL_PASSWORD'),
database: Env.get('MYSQL_DB_NAME'),
},
replicas: {
read: {
connection: [
{
host: '192.168.1.1',
},
{
host: '192.168.1.2',
},
]
},
write: {
connection: {
host: '196.168.1.3',
},
},
},
}
}
}
连接池
连接池 是维护与数据库服务器的最小和最大连接的标准实践。
保持 最小连接数,以提高应用程序性能。由于建立新连接是一项开销很大的操作,因此始终建议准备几个连接来执行数据库查询。
定义 最大连接数 是为了确保你的应用程序不会因过多的并发连接而使数据库服务器不堪重负。
当连接池满时,Lucid 将使新查询进行排队,等待池中有空闲资源,直到超过配置的超时时间。默认超时时间设置为 60秒,可以使用 pool.acquireTimeoutMillis
属性进行配置。
{
mysql: {
client: 'mysql',
connection: {},
pool: {
acquireTimeoutMillis: 60 * 1000,
}
}
}
提示:连接池大小越大,性能越好是一种误解。我们建议你阅读本文档以了解较小的池大小如何提高应用程序性能。
您可以在 config/database.ts
文件中为给定连接池配置设置。
{
connections: {
mysql: {
client: 'mysql',
connection: {
},
pool: {
min: 2,
max: 20,
},
healthCheck: false,
},
}
}
在多个连接之间切换
使用 .connection
方法。 你可以使用 .connection
方法在 config/database.ts
文件中定义的连接之间切换。它接受连接名称并返回 Query client 的实例。
import Database from '@ioc:Adonis/Lucid/Database'
Database
.connection('mysql')
.from('posts')
.select('*')
关闭连接
你可以使用 .close
方法关闭打开的数据库连接。通常,你应该让连接保持更好的性能,除非有特定的原因才进行关闭。
// 关闭特定连接
await Database.manager.close('mysql')
// 关闭所有连接
await Database.manager.closeAll()
健康检查
您可以通过启用config/database.ts
文件中的healthCheck
布尔标志来为已注册的数据库连接启用 健康检查。
{
pg: {
client: 'pg',
connection: {
// ... 连接细节
},
healthCheck: true, // 👈 启用
}
}
驱动配置
以下是所有可用驱动程序的示例配置,你可以将其用作参考并根据需要调整所需的部分。
SQLite
npm i sqlite3
sqlite: {
client: 'sqlite',
connection: {
filename: Application.tmpPath('db.sqlite3'),
},
migrations: {
naturalSort: true,
},
useNullAsDefault: true,
healthCheck: false,
debug: false,
}
MySQL
npm i mysql2
mysql: {
client: 'mysql',
connection: {
host: Env.get('MYSQL_HOST'),
port: Env.get('MYSQL_PORT'),
user: Env.get('MYSQL_USER'),
password: Env.get('MYSQL_PASSWORD', ''),
database: Env.get('MYSQL_DB_NAME'),
},
migrations: {
naturalSort: true,
},
healthCheck: false,
debug: false,
}
您还可以使用 Unix 域套接字连接到 MySQL 数据库。
mysql: {
connection: {
socketPath : '/path/to/socket.sock',
user: Env.get('MYSQL_USER'),
password: Env.get('MYSQL_PASSWORD', ''),
database: Env.get('MYSQL_DB_NAME'),
}
}
PostgreSQL
npm i pg
pg: {
client: 'pg',
connection: {
host: Env.get('PG_HOST'),
port: Env.get('PG_PORT'),
user: Env.get('PG_USER'),
password: Env.get('PG_PASSWORD', ''),
database: Env.get('PG_DB_NAME'),
},
migrations: {
naturalSort: true,
},
healthCheck: false,
debug: false,
}
Oracle DB
npm i oracledb
oracle: {
client: 'oracledb',
connection: {
host: Env.get('ORACLE_HOST'),
port: Env.get('ORACLE_PORT'),
user: Env.get('ORACLE_USER'),
password: Env.get('ORACLE_PASSWORD', ''),
database: Env.get('ORACLE_DB_NAME'),
},
migrations: {
naturalSort: true,
},
healthCheck: false,
debug: false,
}
MSSQL
npm i tedious
mssql: {
client: 'mssql',
connection: {
user: Env.get('MSSQL_USER'),
port: Env.get('MSSQL_PORT'),
server: Env.get('MSSQL_SERVER'),
password: Env.get('MSSQL_PASSWORD', ''),
database: Env.get('MSSQL_DB_NAME'),
},
migrations: {
naturalSort: true,
},
healthCheck: false,
debug: false,
}
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。