Docker中的 PostgreSQL笔记

使用Docker创建PostgreSQL,并使用Python3的pandas库进行操作。

环境:
在macOS Catalina 10.15.6上进行确认,进行文章重写。
Docker版本19.03.8,构建版本afacb8b。
在macOS上,使用的是zsh作为shell,但主机端的提示符写作“$”。

在主机上创建数据库的挂载点。

在当前目录下创建一个名为vols的文件夹。

mkdir ${PWD}/vols

启动容器

    • Container name pg_docker

 

    • パスワード設定 postgres POSTGRES_PASSWORD=postgres

 

    • ポート host port:container port 5432:5432

 

    • volumeをマウント $PWD/vols:/var/lib/postgresql/

カレントディレクトリのvolsにdockerのpostgresqlをマウント

docker run --rm   --name pg-docker -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 -v $PWD/vols:/var/lib/postgresql/data  postgres

确认容器

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
7dc570e3835c        postgres            "docker-entrypoint.s…"   16 hours ago        Up 16 hours         0.0.0.0:5432->5432/tcp   pg-docker

在Container NAME中,使用shell连接到Container。

    • containerに接続、Shellを立ち上げる docker exec コンテナに入るとプロンプトが変わります

-it インターラクティブ ttyを指定
/bin/bash  bashを立ち上げる

postgresユーザーになる su – postgres  また、プロンプトが変わります
一覧を表示する psql -l

$ docker container exec -it pg-docker /bin/bash
root@db8619e414e8:/# su - postgres
postgres@db8619e414e8:~$ psql -l      
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
(3 rows)

使用createdb命令创建名为mydb的数据库,构造CREATE语句。

mydb=# CREATE TABLE weather (
     id serial,
     day date not null,
     city varchar(80) not null,
     temp_max numeric not null,           -- 最低気温
     temp_min numeric not null,           -- 最高気温
     wind real,
    PRIMARY KEY (id)
);

用psql登录到mydb数据库并创建表格

    1. 使用psql进入名为mydb的数据库

 

    1. 创建weather表 CREATE TABLE

 

    1. 查看weather表的定义 \d 表名

 

    1. 插入数据 INSERT INTO

 

    1. 查看数据 SELECT

 

    1. 退出psql \q

 

    1. 退出postgres用户 exit

 

    退出docker容器 exit

天气表定义
id列 是序列型的主键
day列 是日期型的,不能为空
temp_max列 是数字型的,不能为空
temp_min列 是数字型的,不能为空
wind列 是实数型的

postgres@db8619e414e8:~$ psql mydb
psql (12.3 (Debian 12.3-1.pgdg100+1))
Type "help" for help.

mydb=# CREATE TABLE weather (
mydb(#      id serial,
mydb(#      day date not null,
mydb(#      city varchar(80) not null,
mydb(#      temp_max numeric not null,           -- 最低気温
mydb(#      temp_min numeric not null,           -- 最高気温
mydb(#      wind real,
mydb(#     PRIMARY KEY (id)
mydb(# );
CREATE TABLE
mydb=# 

mydb=# \d weather
                                    Table "public.weather"
  Column  |         Type          | Collation | Nullable |               Default               
----------+-----------------------+-----------+----------+-------------------------------------
 id       | integer               |           | not null | nextval('weather_id_seq'::regclass)
 day      | date                  |           | not null | 
 city     | character varying(80) |           | not null | 
 temp_max | numeric               |           | not null | 
 temp_min | numeric               |           | not null | 
 wind     | real                  |           |          | 
Indexes:
    "weather_pkey" PRIMARY KEY, btree (id)

mydb=# INSERT INTO weather VALUES (0,'2019-11-18', 'test',21.3,10.5,0.7);
INSERT 0 1
mydb=# INSERT INTO weather VALUES (1,'2020-07-18', 'test',11.3,7.5,0.7);
INSERT 0 1

mydb=# select * from weather;
 id |    day     | city | temp_max | temp_min | wind 
----+------------+------+----------+----------+------
  0 | 2019-11-18 | test |     21.3 |     10.5 |  0.7
  1 | 2020-07-18 | test |     11.3 |      7.5 |  0.7
(2 rows)


postgres@db8619e414e8:~$ exit
logout
root@db8619e414e8:/# exit
exit
$ 

确认图像并停止容器

    • docker image ls で、最新版のpostgres lateatが取得されている

 

    • docker container ls -a コンテナの確認 STATUSで、Up ~~~を確認

 

    • docker container stop pg-docker コンテナを停止

 

    • docker container ls -a コンテナの確認 綺麗に片づいている

runをしたときのオプション –rm が効いている

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres            latest              4b52913b0a3a        2 days ago          313MB
nginx               latest              0901fa9da894        2 weeks ago         132MB
centos              7                   b5b4d78bc90c        2 months ago        203MB

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
db8619e414e8        postgres            "docker-entrypoint.s…"   About an hour ago   Up About an hour    0.0.0.0:5432->5432/tcp   pg-docker

$ docker container stop pg-docker
pg-docker

$ docker container ls -a         
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

使用Python主机与Docker中的PostgreSQL建立连接,并使用Pandas。

请执行以下操作之一以进行 paraphrase:
1. 在执行这个命令之前,请确保停止前一个容器,或者重新运行 docker container run 命令
2. 在安装 psycopg2 之前,请确保停止之前的容器,或者再次运行 docker container run 命令。

$ python
Python 3.7.5 (default, Oct 25 2019, 10:52:18) 
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> import pandas as pd
>>> # 接続設定
... conn = psycopg2.connect("dbname=mydb host=localhost port=5432 user=postgres password=postgres")
>>> 
>>> query = "SELECT * FROM weather;"
>>> df = pd.read_sql(sql=query, con=conn)
>>> df
   id         day  city  temp_max  temp_min  wind
0   0  2019-11-18  test      21.3      10.5   0.7
1   1  2019-12-18  test      11.3       7.5   0.7
>>> exit()
$

连接设置

    • conn = psycopg2.connect()

dbname=DataBase名 or database=DataBase名
user=ユーザー名
password=パスワード
host=URL
port=ポート番号 defaultの場合省略可

用Pandas的pd.read_sql函数读取SQL查询结果并设置连接。

参考《在Docker中使用PostgreSQL和Docker数据卷挂载》(https://medium.com/faun/postgresql-in-docker-mount-volume-3220fbd0afc4)。

广告
将在 10 秒后关闭
bannerAds