GN.*_*GN. 1 knex.js objection.js
exports.seed = async function(knex, Promise) {
await knex.raw('TRUNCATE TABLE posts RESTART IDENTITY CASCADE')
await knex.raw('TRUNCATE TABLE users RESTART IDENTITY CASCADE')
}
Run Code Online (Sandbox Code Playgroud)
和一些种子数据....
const faker = require('faker')
const post = [
{
id: 1,
title: faker.lorem.words(),
body: '12 - 10',
answers: '[12]',
user_id: 1
},
{
id: 2,
title: faker.lorem.words(),
body: '12 - 10 + 123',
answers: '[12]',
user_id: 1
},
{
id: 3,
title: faker.lorem.words(),
body: '12 - 10 / 901',
answers: '[12]',
user_id: 1
}
]
exports.seed = (knex, Promise) => {
// Deletes ALL existing entries
return knex('post').then(() => {
// Inserts seed entries
return knex('post').insert(post)
})
}
Run Code Online (Sandbox Code Playgroud)
一个简单的更新方法
export async function update(req, res) {
try {
const user = await currentUser()
const params = req.body
await Post.query()
.findById(req.params.id)
.where('user_id', user.id)
.patch({ ...params, user_id: user.id })
return res.json({ success: true })
} catch (err) {
return res.status(500).json({ message: 'Something went wrong' })
}
}
Run Code Online (Sandbox Code Playgroud)
当我在测试中插入时,得到一个
duplicate key value violates unique constraint
即使从种子创建的测试数据的 id 为[1,2,3],插入也会抱怨主数据已被使用。为什么是这样?数据库不应该选择下一个可用的 id 吗?
exports.up = async function(knex) {
await knex.schema.alterTable('posts', (t) => {
t.integer('user_id')
.unsigned()
.references('users.id')
})
}
exports.down = async function(knex) {
await knex.schema.table('posts', (t) => {
t.dropColumn('user_id')
})
}
Run Code Online (Sandbox Code Playgroud)
编辑
即使只插入 SQL .. 也有错误:
INSERT INTO calcs (title, answers, user_id) VALUES ('tester', '[123]', 1);
结果是:`重复键值违反了唯一约束posts_pkey'
我不只是使用 knexdel()调用的原因是因为我在删除带有外键引用的表时遇到错误..
当您从种子插入数据时,您还将id列值传递给数据库。
这会导致您id sequence的主键在您播种初始插入时不会增加。
现在,当您尝试插入更多数据时,播种后id sequence仍会返回从 1 开始的 ID。
您应该在播种期间将您的 id 序列设置为正确的值,如本答案中所述如何重置 postgres 中的序列并用新数据填充 id 列?
| 归档时间: |
|
| 查看次数: |
1367 次 |
| 最近记录: |