通过 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 插入虚假数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Knex.js 进行多行插入

插入后 Knex 解析空集

使用 Knex 和 PG 插入多行

仅当使用 knex 唯一时才插入

Knex 不返回插入 ID

错误 [ERR_HTTP_HEADERS_SENT]:在尝试使用 knex 进行验证和插入时,无法在将标头发送到客户端后设置标头