簡體   English   中英

從PostgreSQL獲取數據的正確方法是什么?

[英]What is the correct way to fetch data from PostgreSQL?

我是PostgreSQL的新手。 我創建了2個表:1個保存帳戶數據的帳戶表和1個帳單。

CREATE TABLE account (
  id        UUID DEFAULT uuid_generate_v1() PRIMARY KEY UNIQUE NOT NULL,
  first_name     VARCHAR(255) NOT NULL,
  last_name      VARCHAR(255) NOT NULL,
  email          VARCHAR(60) UNIQUE NOT NULL,
  password       VARCHAR(60) NOT NULL
);


CREATE TABLE posts (
  id        UUID DEFAULT uuid_generate_v1() PRIMARY KEY UNIQUE NOT NULL,
  account_id   UUID DEFAULT uuid_generate_v1() REFERENCES account(id),
  post         TEXT
);

當我嘗試在1個查詢中獲取有關用戶帳戶+帖子的數據時,我得到以下信息:

[
    {
        "id": ".....",
        "first_name": "Name",
        "last_name": "Last Name",
        "email": "test@test.com",
        "post": "test"
    },
    {
        "id": "......",
        "first_name": "Name",
        "last_name": "Last Name",
        "email": "test@test.com",
        "post": "test 1"
    }
]

這是我用來獲取數據的功能

  static get_all_account_data({ id }) {
    return new Promise((resolve, reject) => {
      pool.query(
        `SELECT 
          account.id, 
          first_name, 
          last_name, 
          email, 
          post
          FROM account INNER JOIN posts 
          ON posts.account_id = account.id 
          WHERE account.id=$1
        `,
        [id],
        (e, response) => {
          if(e) return reject(e);
          resolve(response.rows)
        }
      )
    })
  }

這是獲取數據的正確方法嗎? 返回重復的數據似乎是錯誤的代碼? 我聽說過子查詢。 我是否需要操縱響應以僅擁有一組帳戶數據?

根據您上面的評論:

因此,手頭的問題將是制作一個函數並返回僅包含一組帳戶數據和所有帖子的新obj?

可以使用Postgresql以多種方式完成此操作。 我能想到的一種方法是使用LATERAL JOIN並將“帖子” 聚合到一個數組中:

SELECT
    account.id,
    first_name,
    last_name,
    email,
    jsonb_agg(post) AS posts
FROM
    account
    LEFT JOIN LATERAL (
        SELECT
            post
        FROM
            posts
        WHERE
            posts.account_id = account.id) post ON TRUE
GROUP BY
    account.id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM