如何设置将数据从 CSV 文件加载到 Docker 容器中的 PostgreSQL 数据库的路径?

6 python django postgresql docker docker-compose

我想将数据从 CSV 文件加载到 Docker 中的 PostgreSQL 数据库中。我跑:

docker exec -ti my project_db_1 psql -U postgres
Run Code Online (Sandbox Code Playgroud)

然后我选择我的数据库:

\c myDatabase
Run Code Online (Sandbox Code Playgroud)

现在我尝试myfile.csv将 Django 项目主目录中的数据加载到backend_data表中:

\copy backend_data (t, sth1, sth2) FROM 'myfile.csv' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)

但是我得到错误:

myfile.csv: No such file or directory
Run Code Online (Sandbox Code Playgroud)

在我看来,我尝试了所有可能的路径,但没有任何效果。任何想法我该如何解决?这是我的 docker-compose.yml:

version: '3'

services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
  django:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
Run Code Online (Sandbox Code Playgroud)

Ris*_*nha 8

最简单的方法是将一个目录挂载到 postgres 容器中,将文件放入挂载的目录中,并在那里引用它。

我们实际上是在挂载pgdata目录,以确保即使我们重新创建 postgres docker 容器,postgres 数据仍然存在。所以,我的例子也将使用pgdata

services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    volumes:
      - "<path_to_local_pgdata>:/var/lib/postgresql/data/pgdata"
Run Code Online (Sandbox Code Playgroud)

地方myfile.csv<path_to_local_pgdata>(相对于目录包含的配置或绝对路径)。然后复制命令如下所示:

\copy backend_data (t, sth1, sth2) FROM '/var/lib/postgresql/data/pgdata/myfile.csv' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)