【问题标题】:How do I get an array of objects from Deno's sqlite library?如何从 Deno 的 sqlite 库中获取对象数组?
【发布时间】:2021-12-15 11:11:29
【问题描述】:

我正在尝试从 sqlite 获取 user.foo 和 user.bar 而不是一组值:

https://deno.land/x/sqlite

    let user: any = await db.query('SELECT id, email, hashed_password FROM users WHERE email = ?', [body.email]);

    if (!user || !user.length) {
      context.response.status = 400;
      context.response.body = { message: "User not found" };
      return;
    }   
    user = user[0];
    console.log(user);
    console.log(body.password, user[2]);
    const comparison = await bcrypt.compare(body.password, user[2]);
    console.log('comparison: ', comparison);

这可能吗?

编辑:我在这里仍然收到一个错误,即查询没有返回任何行,即使它在 try catch 中(并且行确实存在)

    try {
      const query = db.prepareQuery<[number, string]>("SELECT id, email, hashed_password FROM users WHERE email = ?",
      [body.email],
     );
      user = query.oneEntry();
    } catch(err) {
      console.error(err);
      context.response.status = 400;
      context.response.body = { message: "User not found" };
      return;
    }

    console.log('user: ', user);

【问题讨论】:

  • 什么是“Deno 的 sqlite 库”?您要导入以创建 db 的模块的 URL 是什么?
  • 添加到问题
  • 您没有包含您所说的错误。如果您在问题中提供Reproducible Example,将会很有帮助。 (例如,您可以复制、粘贴并将我在答案中提供的 TypeScript 文件内容保存为文件:然后运行它,您将看到相同的输出。)这将有助于任何想要帮助您解决问题的人问题。
  • 添加了错误。我想它是如何绑定的?准备查询。我想我做错了。
  • 我看到的您的问题的最新版本是revision 3,其中不包含有关错误的任何信息。

标签: deno deno-sqlite


【解决方案1】:
    let user: any;

    try {
      const query = db.prepareQuery<string>("SELECT id, email, hashed_password FROM users WHERE email = :email",
     );
      user = query.oneEntry({ email: body.email });
      query.finalize();
    } catch(err) {
      console.error(err);
      context.response.status = 400;
      context.response.body = { message: "User not found" };
      return;
    }

    console.log('user: ', user);

【讨论】:

    【解决方案2】:

    假设您指的是https://deno.land/x/sqlite 的模块,您可以使用以下方法从您的查询中接收对象行:

    您可以在查询语句和参数中使用positional or named parameters。在https://www.sqlite.org/lang_expr.html#parameters 阅读更多内容。

    这是一个完整的工作示例,改编自您的问题代码:

    so-69784761.ts

    import {DB, PreparedQuery, Row, RowObject} from 'https://deno.land/x/sqlite@v3.1.1/mod.ts';
    
    const db = new DB();
    const preparedQueries: PreparedQuery[] = [];
    
    function initialize (): void {
      db.query(`
      CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        email TEXT NOT NULL UNIQUE,
        hashed_password TEXT NOT NULL
      );
      `);
    }
    
    function cleanup (): void {
      // All prepared queries need to be finalized before closing the db
      for (const pq of preparedQueries) pq.finalize();
      db.close();
    }
    
    type DBUser = {
      id: number;
      email: string;
      hashed_password: string;
    };
    
    function main () {
      initialize();
    
      // The first two generics don't matter: we don't receive or use the return value
      const insertUserQuery = db.prepareQuery<Row, RowObject, Omit<DBUser, 'id'>>(`
      INSERT INTO users (email, hashed_password)
      VALUES (:email, :hashed_password);
      `);
      preparedQueries.push(insertUserQuery);
    
      for (const user of [
        {email: 'a@example.com', hashed_password: 'a123'},
        {email: 'b@example.com', hashed_password: 'b123'},
      ]) insertUserQuery.execute(user);
    
      const findUserByEmailQuery = db.prepareQuery<
        [DBUser['id'], DBUser['email'], DBUser['hashed_password']],
        DBUser,
        [DBUser['email']]
      >(`
      SELECT id, email, hashed_password
      FROM users
      WHERE email = ?;
      `);
      preparedQueries.push(findUserByEmailQuery);
    
      function findUserByEmail (email: DBUser['email']): DBUser | undefined {
        try {
          return findUserByEmailQuery.oneEntry([email]);
        }
        catch {
          return undefined;
        }
      }
    
      let user = findUserByEmail('a@example.com');
      console.log(user?.email, user?.id, user?.hashed_password);
    
      user = findUserByEmail('b@example.com');
      console.log(user?.email, user?.id, user?.hashed_password);
    
      cleanup();
    }
    
    main();
    
    
    deno run so-69784761.ts
    a@example.com 1 a123
    b@example.com 2 b123
    

    【讨论】:

    • 这似乎过于复杂。 .one()columns as keys 功能是否仅适用于准备好的语句?这个preparedStatements 数组还有什么作用?我没有看到它在任何地方执行。
    • 关于方法:types documentation 包含所有这些引用。我不知道您所说的“columns as keys 功能”是什么意思。关于preparedStatements:如果你的意思是preparedQueries数组:它在cleanup函数中用于完成准备好的查询,必须在干净地关闭数据库之前完成。
    • 获取 user.email 而不是 user[0]
    • 我尝试时似乎总是抛出错误:查看更新的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多