插入查询构建器
插入查询构建器允许您将新行插入数据库。你必须使用 标准查询生成器 来选择、删除或更新行。
你可以访问插入查询构建器,如以下示例所示:
import Database from '@ioc:Adonis/Lucid/Database'
Database.insertQuery()
// 选择表还返回查询生成器的实例
Database.table('users')
方法/属性
以下是插入查询构建器类中可用的方法和属性列表。
insert
insert
方法接受要插入的键值对对象。
插入查询的返回值高度依赖于底层驱动程序。
- MySQL 返回最后插入的行的 id。
- SQLite 返回最后插入行的 id。
- 对于 PostgreSQL、MSSQL 和 Oracle,你必须使用
returning
方法来获取 id 的值。
Database
.table('users')
.returning('id')
.insert({
username: 'virk',
email: 'virk@adonisjs.com',
password: await Hash.make('secret'),
})
multiInsert
multiInsert
方法接受一个对象数组并一次插入多行。
Database
.table('users')
.multiInsert([
{
username: 'virk',
email: 'virk@adonisjs.com',
password: await Hash.make('secret'),
},
{
username: 'romain',
email: 'romain@adonisjs.com',
password: await Hash.make('secret'),
}
])
/**
INSERT INTO "users"
("email", "password", "username")
values
('virk@adonisjs.com', '$argon2id...', 'virk'),
('romain@adonisjs.com', '$argon2id...', 'romain')
*/
returning
你可以对 PostgreSQL、MSSQL 和 Oracle 数据库使用 returning
方法来检索一个或多个列的值。
const rows = Database
.table('users')
.returning(['id', 'username'])
.insert({
username: 'virk',
email: 'virk@adonisjs.com',
password: await Hash.make('secret'),
})
console.log(rows[0].id, rows[0].username)
debug
debug
方法允许在单个查询级别启用或禁用调试。这是关于调试查询的完整指南。
const rows = Database
.table('users')
.debug(true) // 👈
.insert({
username: 'virk',
email: 'virk@adonisjs.com',
password: await Hash.make('secret'),
})
timeout
为查询定义超时。超过超时后引发异常。
timeout 的值始终以毫秒为单位。
Database
.table('users')
.timeout(2000) // 👈
.insert({
username: 'virk',
email: 'virk@adonisjs.com',
password: await Hash.make('secret'),
})
你还可以在 MySQL 和 PostgreSQL 使用超时时取消查询。
Database
.table('users')
.timeout(2000, { cancel: true })
.insert({
username: 'virk',
email: 'virk@adonisjs.com',
password: await Hash.make('secret'),
})
toSQL
toSQL
方法将查询 SQL 和绑定作为对象返回。
const output = Database
.table('users')
.insert({
username: 'virk',
email: 'virk@adonisjs.com',
password: await Hash.make('secret'),
})
.toSQL() // 👈
console.log(output)
toSQL
对象还具有 toNative
方法来根据使用的数据库方言格式化 SQL 查询。
const output = Database
.table('users')
.insert({
username: 'virk',
email: 'virk@adonisjs.com',
password: await Hash.make('secret'),
})
.toSQL()
.toNative()
console.log(output)
toQuery
将 SQL 查询作为字符串返回,并将绑定应用于占位符。
const output = Database
.table('users')
.insert({
username: 'virk',
email: 'virk@adonisjs.com',
password: await Hash.make('secret'),
})
.toQuery()
console.log(output)
/**
INSERT INTO "users"
("email", "password", "username")
values
('virk@adonisjs.com', '$argon2id...', 'virk')
*/
useTransaction
useTransaction
方法指示查询构建器将查询包装在事务中。 数据库事务 指南涵盖了在应用程序中创建和使用事务的不同方法。
const trx = await Database.transaction()
await Database
.table('users')
.useTransaction(trx) // 👈
.insert({
username: 'virk',
email: 'virk@adonisjs.com',
password: await Hash.make('secret'),
})
await trx.commit()
有用的属性和方法
以下是在查询构建器之上构建某些内容时可能偶尔需要的属性和方法列表。
client
参考底层数据库查询客户端的实例。
const query = Database.insertQuery()
console.log(query.client)
knexQuery
对底层 KnexJS 查询实例的引用。
const query = Database.insertQuery()
console.log(query.knexQuery)
reporterData
查询构建器发出 db:query
事件并使用框架分析器报告查询的执行时间。
使用 reporterData
方法,你可以将其他详细信息传递给事件和分析器。
const query = Database.table('users')
await query
.reporterData({ userId: auth.user.id })
.insert({
username: 'virk',
email: 'virk@adonisjs.com',
password: await Hash.make('secret'),
})
在 db:query
事件中,你可以访问 userId
的值,如下所示。
Event.on('db:query', (query) => {
console.log(query.userId)
})
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。