在Ubuntu20.04上安装PostgreSQL和PostGIS
首先
我正在尝试使用QGIS的qwc2进行Web发布,但是当我将在本地创建的QGIS项目上传到服务器时,由于服务器本身是在GCP上构建的,所以存在数据引用不存的情况。(因为QGIS服务器和本地PC不在同一网络上,这是理所当然的事情…)
因此,我在服务器上搭建了PostgreSQL,并尝试以从本地的PostgreSQL进行外部引用的方式来保持相同的表结构,我想记录下其基本内容。
运行环境
【个人电脑操作系统】
– Ubuntu20.04 LTS
【软件版本】
– PostgreSQL 11系列
– PostGIS 2.5
这次要做的事情
1.在Ubuntu20.04上安装PostgreSQL和PostGIS
2.确认来自外部的连接
3.在本地的PostgreSQL上创建外部参考表
安装Ubuntu20.04上的PostgreSQL和PostGIS。
$ sudo apt update
$ sudo apt -y upgrade
下载公钥
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
我想要安装PostgreSQL-11系列和PostGIS-2.5,所以需要添加存储库。
$ echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/postgresql-pgdg.list > /dev/null
再次更新基础系统
$ sudo apt update
安装PostgreSQL和PostGIS。
$ sudo apt install postgresql-11-postgis-2.5
请确认安装是否已成功完成。
$ dpkg -l | grep post
ii pgdg-keyring 2018.2 all keyring for apt.postgresq
l.org
ii postgresql-11 11.12-1.pgdg20.04+1 amd64 The World's Most Advanced
Open Source Relational Database
ii postgresql-11-postgis-2.5 2.5.5+dfsg-1.pgdg20.04+2 amd64 Geographic objects suppor
t for PostgreSQL 11
ii postgresql-11-postgis-2.5-scripts 2.5.5+dfsg-1.pgdg20.04+2 all Geographic objects suppor
t for PostgreSQL 11 -- SQL scripts
ii postgresql-client-11 11.12-1.pgdg20.04+1 amd64 front-end programs for Po
stgreSQL 11
ii postgresql-client-common 226.pgdg20.04+1 all manager for multiple Post
greSQL client versions
ii postgresql-common 226.pgdg20.04+1 all PostgreSQL database-clust
er manager
使用Postgres账户启动psql。
$ sudo -u postgres psql
获取数据库列表
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+---------+-----------------------
postgres | postgres | UTF8 | C.UTF-8 | C.UTF-8 |
template0 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
创建数据库
※暂时退出Ctrl + D后,执行以下操作。
$ sudo -u postgres createdb test_db
再次获取数据库列表
※确保已经添加了test_db。
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+---------+-----------------------
postgres | postgres | UTF8 | C.UTF-8 | C.UTF-8 |
template0 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
test_db | postgres | UTF8 | C.UTF-8 | C.UTF-8 |
添加用于操作已创建的数据库的用户
※需要设置密码。
$ sudo -u postgres createuser -P 【ユーザー名】
Enter password for new role:
给添加的用户授予对数据库的权限
* 在下面的命令中授予新创建的 test_db 权限
使用postgres账户,启动psql。
$ sudo -u postgres psql
postgres=# grant all privileges on database test_db to 【ユーザー名】;
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+---------+-----------------------
postgres | postgres | UTF8 | C.UTF-8 | C.UTF-8 |
template0 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
test_db | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | 【ユーザー名】=CTc/postgres
将开发好的数据库添加了用于GIS的功能扩展。
$ sudo -u postgres psql test_db
test_db=# CREATE EXTENSION postgis;
CREATE EXTENSION
2. 外部连接确认
更改设置以允许外部连接。
编辑pg_hba.conf文件。
sudo nano /etc/postgresql/11/main/pg_hba.conf
# ----------------------------省略--------------------------------------
# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 【接続許可するIPアドレス】 md5 # ここを追記!
# ----------------------------省略--------------------------------------
编辑postgresql.conf
$ sudo nano /etc/postgresql/11/main/postgresql.conf
listen_addresses = '*'
以下为启动和停止PostgreSQL的命令。
# 起動
$ sudo service postgresql start
# 停止
$ sudo service postgresql stop
# 再起動
$ sudo service postgresql restart
我尝试从本地的电脑连接(我使用pgAdmin4进行连接)。
※ 如果在GCP上的防火墙设置中忘记打开端口5432,则无法连接,请注意。
如果能够连接到test_db并执行以下查询,则没有问题!
-- スキーマ作成のクエリ
CREATE SCHEMA sample_schema;
-- Geometory型を含むテーブルの作成
CREATE TABLE sample_shema.sptb1 (
gid SERIAL PRIMARY KEY
,geom GEOMETRY(POINT, 4326)
);
在本地的PostgreSQL中创建外部参照表。
作为前提条件,本地计算机的操作系统和Postgres版本如下:
– Windows 10专业版
– PostgreSQL 10系列
– PostGIS 2.5系列
在GCP上的PostgreSQL(11系列)中创建以下表格(准备被引用的数据)。
-- 参照される側のテーブルを作成
CREATE TABLE sample_schema.sptb2 (
link_no SERIAL PRIMARY KEY
,name VARCHAR(10) not null
,age INTEGER not null
);
-- データも入れておく
INSERT INTO sample_schema.sptb2 VALUES (1, '鈴木花子', 20);
在本地的PostgreSQL(10系列)中执行以下查询的代码,请选择任意的数据库。
-- DBに対して拡張機能を付けているため、初回のみでOK。 ※[IF NOT EXISTS] はまだ存在していない時に実行という意味合い
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
-- 参照先の外部サーバオブジェクトを作成。対象のDBもここで入力。
CREATE SERVER remote_serv1
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '【GCP上のサーバーの外部IP】', port '5432', dbname 'test_db');
-- ローカルのユーザと参照先ユーザ(& パスワード)をマッピングする設定
CREATE USER MAPPING
FOR 【ローカルのPosgres上のユーザー】 SERVER remote_serv1
OPTIONS (USER 'ext_user', PASSWORD '*******');
-- 外部テーブル定義の設定 ※外部テーブルのカラム定義は参照される側のテーブルと一致していなければならない。
CREATE FOREIGN TABLE 【ローカルPostgresの任意のスキーマ】.sptb2(
link_no SERIAL
,name VARCHAR(10) not null
,age INTEGER not null
) SERVER remote_serv1;
-- 外部テーブル定義を削除するときは、以下のコマンド
-- ※もちろん、外部DBにあるテーブル自体は削除されない。
DROP FOREIGN TABLE 【ローカルPostgresの任意のスキーマ】.sptb2;
可以通过导入来定义外部表。可能这样更好,因为可以避免不必要的错误。
DROP FOREIGN TABLE IF EXISTS 【参照する側(ローカルPostgres)のスキーマ】.sptb2;
IMPORT FOREIGN SCHEMA 【参照される側の対象スキーマ】 -- 今回の場合 [sample_schema]
LIMIT TO (sptb2) -- 対象のテーブルだけインポート
FROM SERVER remote_serv1 INTO 【参照する側(ローカルPostgres)のスキーマ】;
我基本上参考了这个。
在本地Postgres数据库中运行以下命令,如果能正确显示,则表示OK!
SELECT * FROM 【参照する側(ローカルPostgres)のスキーマ】.sptb2;
顺便提一下,如果被引用的原始表增加了记录,也没有问题可以进行引用,但是如果列的结构发生了变化,外部表的定义也必须重新设置,所以需要注意!
给个小赠品
在安装PostgreSQL时,默认已经创建了一个名为postgres的数据库管理用户,但是由于该用户的密码是未知的,因此不能使用密码登录。为了首次创建数据库或设置数据库用户,必须先转换为postgres用户,因此需要设置postgres用户的密码,以便进行登录。
$ sudo passwd postgres