簡體   English   中英

Prisma 創建數據庫但隨后說無法連接到它

[英]Prisma creates database but then says it can't connect to it

我有一個包含 2 個圖像的 docker 容器。 我的應用程序和我的數據庫(postgres)它們都在運行,應用程序在:3000 上,postgres 在:5432 上。 當我運行npx prisma migrate dev --name init時,出現以下錯誤:

Environment variables loaded from .env
Prisma schema loaded from lib/database/myschema.prisma
Datasource "db": PostgreSQL database "sales", schema "public" at "postgres:5432"

Error: P1001: Can't reach database server at `postgres`:`5432`

Please make sure your database server is running at `postgres`:`5432`.

如果我檢查,會創建數據庫,但不會在其中創建任何表。 我不明白這個錯誤,因為如果創建數據庫顯然路徑是正確的並且 prisma 至少能夠運行查詢。

我還使用 PgAdmin 連接到數據庫,並且能夠毫無問題地運行查詢和創建表。

此外,如果我停止應用程序圖像但保留 postgres 圖像並將數據庫 url 更改為postgresql://admin:admin@localhost:5432/sales我可以直接從我的本地存儲庫運行遷移而沒有問題並且表格是創建。

這是我的 schema.prisma

datasource db {
  url      = env("DATABASE_URL")
  provider = "postgresql"
}

generator client {
  provider = "prisma-client-js"
  binaryTargets = ["native", "linux-arm64-openssl-1.1.x"]

}

model Sale {
  id              Int     @id @default(autoincrement())
  saleId          Int
  uniqueSaleId    String
  createdAt       DateTime
  completedAt     DateTime
  storeId         Int
  vendorId        Int
  customerId      Int
  currency        String
  payment         String
  total           Float
  productSolds  ProductSolds[]
  accountId       String
  account         Account @relation(fields: [accountId], references: [id], onDelete: Cascade)

  @@unique([saleId, accountId])
}

model ProductSolds {
  id                         Int     @id @default(autoincrement())
  productId                  Int
  productSize                  Int
  quantity                   Int
  productPrice               Float
  productCurrency              String
  vat                          Float
  package                      Int
  points                       Int
  discount                   Float
  stockWithdrawal            Int
  creditNote                   Int
  creditNoteId               Int
  productComments              Float
  serialNumber               Float
  lineItemIdReturn           Int
  dateReturn                 Int
  kitchenPos                 Int
  productSupplyPrice           Float
  lineItemId                   Int
  detailCommandeId           Int
  saleId                     Int
  sale                       Sale @relation(fields: [saleId], references: [id], onDelete: Cascade)
}


model EndpointCalled{
  id                         Int     @id @default(autoincrement())
  accountId                  String
  year                       Int
  month                      Int
  day                        Int
  storeId                    Int
  @@unique([accountId,year,month,day,storeId])
}

model Account {
  id   String @id
  Sale Sale[]
}

我在 my.env 中的 DATABASE_URL 是postgresql://admin:admin@postgres:5432/sales盡管當我在 docker 之外運行應用程序時出於測試目的將其更改為 localhost(並且它有效)。

我雖然問題可能與 docker 內的服務名稱有關,所以我用container_name: postgres指定了它

我的 docker-compose:

version: "3.7"
services:
  node:
    build:
      context: .
      dockerfile: devops/docker/dockerfiles/Dockerfile
      target: development
    volumes:
      - .:/home
      - ${GCP_SA_KEYS_PATH}:/gcp-sa-keys
    command: shell
    environment:
      adminBearerTokens: 1234
      GOOGLE_APPLICATION_CREDENTIALS: /gcp-sa-keys/${GCP_SA_KEY}
      DATABASE_URL: ${DATABASE_URL:-postgresql://admin:admin@postgres:5432/sales}
      HIBOUTIK_USER: ${HIBOUTIK_USER}
      HIBOUTIK_API_KEY: ${HIBOUTIK_API_KEY}
    depends_on:
      - postgres
    ports:
      - "3000:3000"
  postgres:
    image: postgres:14.1-alpine
    container_name: postgres
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
    ports:
      - "5432:5432"

如果這是相關的,我在 macbook air M1 上運行容器並且不得不稍微修改圖像以使其運行。

我在這里找到了解決方案

解決方法是在字符串末尾添加?connect_timeout=300 所以在我的例子中postgresql://admin:admin@postgres:5432/sales?connect_timeout=300

這似乎是節點 16、prisma 和 mac M1 的問題。 為什么添加connect_timeout=300有效? 我不知道,我無法在網上找到答案。 但我可以運行我的遷移,現在一切都運行順利。

數據庫 url 不正確。 你需要這樣的東西:

DATABASE_URL=driver://username:password@hostname:port/database_name

你有

DATABASE_URL:${DATABASE_URL:postgresql://admin:admin@ postgres :5432/sales}

您使用“postgres”代替主機名。 除非你有這樣的主機,否則它不會工作。 並且錯誤消息告訴我們您沒有此主機。 “localhost”在連接本地時有效,否則您需要 ip 地址或主機名。 這取決於您的設置。

暫無
暫無

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

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