Postgresql之(1)自动化脚本
创始人
2025-05-28 13:53:17
0

Postgresql之自动化脚本操作

Author:OnceDay Date:2023年3月15日

漫漫长路,才刚刚开始…

1. 概述

本文总结一些最近使用的postgresql脚本使用方法,并非专业数据库维护人员,仅用于入门使用

下面是官方引导文档:

  • PostgreSQL Tutorial - Learn PostgreSQL from Scratch

安装postgresql比较方便,下面以linux为例,对于其他平台,可参考以下文档:

  • Getting Started with PostgreSQL (postgresqltutorial.com)

在Ubuntu下,按以下步骤执行命令即可(最基础的安装,不包含指定版本和仓库源操作):

  • sudo apt-get update,更新仓库信息。
  • sudo apt-get install postgresql,安装postgresql。

然后等待一段时间即可

一般postgresql不允许使用root账户进行操作,可以创建新账户来使用postgresql,这里使用默认的postgres账号,由postgresql安装时自动创建。

使用下面命令切换到postgres账户:

sudo -i -u postgres

然后就可以使用psql来操作数据库了。

onceday->root:$ psql --help
psql is the PostgreSQL interactive terminal.Usage:psql [OPTION]... [DBNAME [USERNAME]]
.....

通过上面的命令可以查看psql支持的命令。

1.2 基础的postgresql使用
对于非专业数据库操作人员来说,比如偶尔需要使用数据库查看数据的底层开发人员,掌握以下几个基础命令即可。

首先进入命令行:

onceday->root:$ psql
psql (13.3)
Type "help" for help.postgres=# 

查看命令行内的帮助信息:

postgres=# help
You are using psql, the command-line interface to PostgreSQL.
Type:  \copyright for distribution terms\h for help with SQL commands\? for help with psql commands\g or terminate with semicolon to execute query\q to quit

可以看到,使用\qctrl +D可以退出psql命令行。\h查看SQL标准的命令。\?则是查看psql独有的命令。

一般使用\l列出当前的全部数据库,使用\c选择特定的数据库。

postgres=# \lList of databasesName      |    Owner    | Encoding  | Collate | Ctype |   Access privileges   
----------------+-------------+-----------+---------+-------+-----------------------logXXXXXDb   | log_collect | SQL_ASCII | C       | C     | 
......
postgres=# \c logXXXXXDb
You are now connected to database "logXXXXXDb" as user "postgres".

其他有用的命令还有很多。当选择到特定数据库之后,就可以使用标准的sql语句来查询了。

下面直接进入主题。

2. python自动化读写

重点看一下以下几个psql支持的命令:

-c, --command=COMMAND    run only single command (SQL or internal) and exit
-d, --dbname=DBNAME      database name to connect to (default: "postgres")
-f, --file=FILENAME      execute commands from file, then exit
-o, --output=FILENAME    send query results to file (or |pipe)

即可以指定数据库,并且能从命令行和文件中读取指令,然后输出到指定文件中。

下面是一个简单的例子:

onceday:$ psql -d logXXXXDb -c 'select * from "flowXXXX";'timestamp  | value1
------------+------+1677600000 |    1 |1677600000 |    2 |1677600000 |    3 |1677600000 |    4 |

注意,这里使用单引号包裹,因为在postgresql里面带大写的表名需要使用双引号括起来,才能正确识别

为了避免单引号和双引号冲突,可以根据支持来合理使用。

2.1 从CSV文件中导入数据到数据库里

COPY命令支持从csv导入数据到表中,命令格式如下:

COPY "table_name" (datetime, type, val1, val2)
FROM './data.csv'
DELIMITER ','
CSV HEADER;
  • table_name是想导入数据的目标表名,用双引号括起来,防止无法识别大写的情况。
  • (datetime, type, val1, val2)是准备导入的四列数据,对应表中的列名。
  • FROM './data.csv'是导入的CSV数据所在路径。
  • DELIMITER是CSV数据的分割符。
  • CSV HEADER,是忽略CSV数据的第一行,为数据标题。

如下的CSV数据便可以导入:

datetime, type, val1, val2
1111, 2, 3, 4
1112, 2, 3, 4
1113, 2, 3, 4
......

一般会使用\copy形式,这表示在psql这边执行,COPY在服务端执行。

\copy "table_name" (datetime, type, val1, val2) from './data.csv' delimiter ',' csv header

两者格式一模一样,没有区别

下面是一个完整的创建表格+导入数据的sql脚本。

--psql -d logConnectDb -f this_file_path
-- 切换到指定数据库,省略
-- 创建数据表
CREATE TABLE If not exists "table_name"(timestamp bigint,type integer,value1 integer,value2 integer
);
--创建索引
CREATE INDEX "table_name_timestamp_index"
ON "table_name" (timestamp);
CREATE INDEX "table_name_type_index"
ON "table_name" (type);
--导入数据
\copy "table_name" (timestamp, type, value1, value2) from './data.csv' delimiter ',' csv header

在Python里面可以如下编写:

def write_sql_file(table_name):tem_sql = f'''DROP TABLE if exists "{table_name}";CREATE TABLE "{table_name}"(timestamp bigint,type integer,);CREATE INDEX "{table_name}_timestamp_index"ON "{table_name}" (timestamp);CREATE INDEX "{table_name}_type_index"ON "{table_name}" (type);\\copy "{table_name}" (timestamp, type) from './data.csv' delimiter ',' csv header'''with open("./pg.sql", "+w") as f:f.write(tem_sql)

可以使用变量来定义各类名字,组装各种字符,一次性写入sql脚本,然后一起执行

如下:

write_data_file(...)
write_sql_file(...)
ret = os.popen("psql -d XXXXDb -f ./pg.sql")
print(ret.read())

当写完数据文件和sql脚本文件后,便可以采用psql命令一次性执行它们。然后读取返回结果,这里也可以使用-o选项将结果直接输出到文件中。

这个方法主要用于底层开发人员往数据库写入测试数据,然后提供给web开发人员测试,不适用于专业数据库维护场景

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...