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

时间:2017-10-20 12:56:16

标签: python django postgresql docker docker-compose

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

docker exec -ti my project_db_1 psql -U postgres

然后我选择我的数据库:

\c myDatabase

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

\copy backend_data (t, sth1, sth2) FROM 'myfile.csv' CSV HEADER;

然而我收到错误:

myfile.csv: No such file or directory

在我看来,我尝试了所有可能的路径而没有任何作用。任何想法我该如何解决?这是我的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

2 个答案:

答案 0 :(得分:2)

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

我们实际上正在安装pgdata目录,以确保即使我们重新创建postgres docker容器,postgres数据也会存在。所以,我的示例也将使用pgdata

services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    volumes:
    volumes:
      - "<path_to_local_pgdata>:/var/lib/postgresql/data/pgdata"

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

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

答案 1 :(得分:1)

如果在该容器中运行命令,则需要在myfile.csv容器中挂载db的路径。

您可能只在django服务中安装了该文件。

可能docker-compose.yml

version: '3'

services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    volumes:
      - <path_to_csv_in_local>:<path_of_csv_in_db_container>
  django:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

您尚未创建db的装载。一旦关闭数据库容器,这将会致命(您将丢失所有数据)。 postgresql容器将数据存储在/var/lib/postgresql/data中。您需要将此路径安装到本地系统,以便即使容器关闭也能保持数据。

volumes:
  - <path_of_db_in_local_system>:/var/lib/postgresql/data