通过 knex 插入虚假数据
Posted
技术标签:
【中文标题】通过 knex 插入虚假数据【英文标题】:Insert fake data via knex 【发布时间】:2018-02-25 13:06:20 【问题描述】:我正在尝试使用 faker 通过 knex 将数据插入到我的 postgresql 数据库中。
请看下面的最小示例:
//Loading from an external file
var knex = require('knex')(
client: 'postgresql',
connection:
database: 'knexdb',
user: 'root',
password: 'root'
,
debug: false,
)
// using faker
const faker = require('faker')
async function main()
//test connection
await knex.raw('select 1+1 as result').then(function ()
console.log("valid db connection")
// there is a valid connection in the pool
);
//delete data
await knex('posts').del().then(function ()
const res = knex('posts')
if (res)
console.log("Table content deleted")
else
console.log(res)
)
const dataAmount = 3
console.log("lets insert " + dataAmount + " rows of data")
for (var index = 0; index < dataAmount; index++)
try
await knex('posts').insert(
title: faker.random.word,
description: faker.lorem.paragraph,
deleted: faker.random.boolean,
createdAt: faker.date.recent,
updatedAt: faker.date.recent
)
catch (e)
console.log(e)
// select all
res = await knex('posts')
console.log('All: ', res)
main() //.then().catch(err => console.error(err))
我收到以下错误SELECT * with no tables specified is not valid
。请参阅下面的完整输出:
有效的数据库连接 表格内容已删除 插入3行数据 错误:未指定表的 SELECT * 无效 在 Connection.parseE (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:546:11) 在 Connection.parseMessage (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:371:19) 在套接字。 (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:114:22) 在 emitOne (events.js:115:13) 在 Socket.emit (events.js:210:7) 在 addChunk (_stream_readable.js:266:12) 在 readableAddChunk (_stream_readable.js:253:11) 在 Socket.Readable.push (_stream_readable.js:211:10) 在 TCP.onread (net.js:585:20) 名称:'错误', 长度:117, 严重性:'错误', 代码:'42601', 详细信息:未定义, 提示:未定义, 位置:'99', 内部位置:未定义, 内部查询:未定义, 其中:未定义, 架构:未定义, 表:未定义, 列:未定义, 数据类型:未定义, 约束:未定义, 文件:'parse_target.c', 行:'1211', 例程:'ExpandAllTables' 错误:未指定表的 SELECT * 无效 在 Connection.parseE (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:546:11) 在 Connection.parseMessage (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:371:19) 在套接字。 (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:114:22) 在 emitOne (events.js:115:13) 在 Socket.emit (events.js:210:7) 在 addChunk (_stream_readable.js:266:12) 在 readableAddChunk (_stream_readable.js:253:11) 在 Socket.Readable.push (_stream_readable.js:211:10) 在 TCP.onread (net.js:585:20) 名称:'错误', 长度:117, 严重性:'错误', 代码:'42601', 详细信息:未定义, 提示:未定义, 位置:'99', 内部位置:未定义, 内部查询:未定义, 其中:未定义, 架构:未定义, 表:未定义, 列:未定义, 数据类型:未定义, 约束:未定义, 文件:'parse_target.c', 行:'1211', 例程:'ExpandAllTables' 错误:未指定表的 SELECT * 无效 在 Connection.parseE (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:546:11) 在 Connection.parseMessage (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:371:19) 在套接字。 (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:114:22) 在 emitOne (events.js:115:13) 在 Socket.emit (events.js:210:7) 在 addChunk (_stream_readable.js:266:12) 在 readableAddChunk (_stream_readable.js:253:11) 在 Socket.Readable.push (_stream_readable.js:211:10) 在 TCP.onread (net.js:585:20) 名称:'错误', 长度:117, 严重性:'错误', 代码:'42601', 详细信息:未定义, 提示:未定义, 位置:'99', 内部位置:未定义, 内部查询:未定义, 其中:未定义, 架构:未定义, 表:未定义, 列:未定义, 数据类型:未定义, 约束:未定义, 文件:'parse_target.c', 行:'1211', 例程:'ExpandAllTables' 全部: [] ^C C:\Users\user\Desktop\Coding Projects\learning_knex\src>node t3-faker.js 有效的数据库连接 表格内容已删除 让我们插入 3 行数据 错误:未指定表的 SELECT * 无效 在 Connection.parseE (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:546:11) 在 Connection.parseMessage (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:371:19) 在套接字。 (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:114:22) 在 emitOne (events.js:115:13) 在 Socket.emit (events.js:210:7) 在 addChunk (_stream_readable.js:266:12) 在 readableAddChunk (_stream_readable.js:253:11) 在 Socket.Readable.push (_stream_readable.js:211:10) 在 TCP.onread (net.js:585:20) 名称:'错误', 长度:117, 严重性:'错误', 代码:'42601', 详细信息:未定义, 提示:未定义, 位置:'99', 内部位置:未定义, 内部查询:未定义, 其中:未定义, 架构:未定义, 表:未定义, 列:未定义, 数据类型:未定义, 约束:未定义, 文件:'parse_target.c', 行:'1211', 例程:'ExpandAllTables' 错误:未指定表的 SELECT * 无效 在 Connection.parseE (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:546:11) 在 Connection.parseMessage (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:371:19) 在套接字。 (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:114:22) 在 emitOne (events.js:115:13) 在 Socket.emit (events.js:210:7) 在 addChunk (_stream_readable.js:266:12) 在 readableAddChunk (_stream_readable.js:253:11) 在 Socket.Readable.push (_stream_readable.js:211:10) 在 TCP.onread (net.js:585:20) 名称:'错误', 长度:117, 严重性:'错误', 代码:'42601', 详细信息:未定义, 提示:未定义, 位置:'99', 内部位置:未定义, 内部查询:未定义, 其中:未定义, 架构:未定义, 表:未定义, 列:未定义, 数据类型:未定义, 约束:未定义, 文件:'parse_target.c', 行:'1211', 例程:'ExpandAllTables' 错误:未指定表的 SELECT * 无效 在 Connection.parseE (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:546:11) 在 Connection.parseMessage (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:371:19) 在套接字。 (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\pg\lib\connection.js:114:22) 在 emitOne (events.js:115:13) 在 Socket.emit (events.js:210:7) 在 addChunk (_stream_readable.js:266:12) 在 readableAddChunk (_stream_readable.js:253:11) 在 Socket.Readable.push (_stream_readable.js:211:10) 在 TCP.onread (net.js:585:20) 名称:'错误', 长度:117, 严重性:'错误', 代码:'42601', 详细信息:未定义, 提示:未定义, 位置:'99', 内部位置:未定义, 内部查询:未定义, 其中:未定义, 架构:未定义, 表:未定义, 列:未定义, 数据类型:未定义, 约束:未定义, 文件:'parse_target.c', 行:'1211', 例程:'ExpandAllTables' 全部:[]
任何建议我做错了什么?
【问题讨论】:
【参考方案1】:你混合了 promises 和 async / await 这使得代码更难阅读并且你在那里也犯了一些错误,也许这正是你想要做的:
//Loading from an external file
var knex = require('knex')(
client: 'postgresql',
connection:
database: 'knexdb',
user: 'root',
password: 'root'
,
debug: false,
)
// using faker
const faker = require('faker')
async function main()
//test connection
await knex.raw('select 1+1 as result');
console.log("valid db connection");
//delete data
await knex('posts').del();
const res = await knex('posts'); // FIXED: this was missing await
if (res.length === 0) // FIXED: also empty array is truthy
console.log("Table content deleted");
else
console.log(res);
const dataAmount = 3
console.log(`lets insert $dataAmount rows of data`);
for (let index = 0; index < dataAmount; index++)
try
// FIXED: faker calls were missing () from the end
await knex('posts').insert(
title: faker.random.word(),
description: faker.lorem.paragraph(),
deleted: faker.random.boolean(),
createdAt: faker.date.recent(),
updatedAt: faker.date.recent()
);
catch (e)
console.log(e);
// select all
let finalRes = await knex('posts');
console.log('All: ', finelRes);
main().then().catch(err => console.error(err));
我想SELECT *
没有表错误是由于某种原因造成的,因为您试图将函数而不是值写入数据库。
【讨论】:
【参考方案2】:你传递函数而不是它们的返回值。
await knex('posts').insert(
title: faker.random.word,
description: faker.lorem.paragraph,
deleted: faker.random.boolean,
createdAt: faker.date.recent,
updatedAt: faker.date.recent
)
以下代码 sn-p 应该为您提供所需的行为:
await knex('posts').insert(
title: faker.random.word(),
description: faker.lorem.paragraph(),
deleted: faker.random.boolean(),
createdAt: faker.date.recent(),
updatedAt: faker.date.recent()
)
【讨论】:
以上是关于通过 knex 插入虚假数据的主要内容,如果未能解决你的问题,请参考以下文章
错误 [ERR_HTTP_HEADERS_SENT]:在尝试使用 knex 进行验证和插入时,无法在将标头发送到客户端后设置标头