我想将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
答案 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