[英]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.