postgres数据库入门, python 操作postgres

Posted brucelong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了postgres数据库入门, python 操作postgres相关的知识,希望对你有一定的参考价值。

linux安装postgres参考: https://blog.csdn.net/luanpeng825485697/article/details/80875860

docker 安装postgres参考:https://blog.csdn.net/luanpeng825485697/article/details/81209596

postgres常用linux命令
进入pgsql命令行,切换到Linux用户postgres,然后执行psql:

$ su - postgres
Last login: Wed Mar 1 13:16:48 CST 2017 on pts/1
$ psql
psql (9.2.18)
Type "help" for help.
postgres=#

此时就在数据库postgres中了。

显示用户生成的数据库列表
d
显示某个表列属性
d tablename
查询数据
select camera_ip,camera_id from device;

创建数据库
CREATE DATABASE mydb;
删除数据库
DROP DATABASE mydb;
创建表
CREATE TABLE weather (
    city            varchar(80),
    temp_lo         int,           -- 最低温度
    temp_hi         int,           -- 最高温度
    prcp            real,          -- 湿度 real是一种用于存储单精度浮点数的类型
    date            date
);
CREATE TABLE cities (
    name            varchar(80),
    location        point
);
创建索引
create index tablename_columnname_idx on public.tablename (columnname)

删除表
DROP TABLE cities;
DROP TABLE weather

在表中增加行
INSERT INTO weather VALUES (San Francisco, 46, 50, 0.25, 1994-11-27);
INSERT INTO cities VALUES (San Francisco, (-194.0, 53.0));
INSERT INTO weather (city, temp_lo, temp_hi, prcp, date) 
    VALUES (San Francisco, 43, 57, 0.0, 1994-11-29);
INSERT INTO weather (date, city, temp_hi, temp_lo) 
    VALUES (1994-11-29, Hayward, 54, 37);

参考:https://blog.csdn.net/taoshujian/article/details/60882172

jsonb相关操作

参考:https://zgljl2012.com/postgresql-cun-qu-jsonb/

建表语句如下:

create table if not exists name_age (  
    info jsonb
)

插入数据
插入数据可以直接以json格式插入:

insert into name_age values({"id":1,"name":"小明", "age":18})

在json里插入新的key值gender,如下:

SELECT info||{"gender":"男"}::jsonb from name_age where (info->>id)::int4 = 1

查询数据

Postgres里的查询需要用到查询符。比如说,我们要查询id为1的数据,语句如下:

select info from name_age where info @> {"id":1}::jsonb

用到了 @> 这个查询符,表明info当前这条记录里的顶层json中有没有id为1的key-value对;有的话则满足条件。

再来一个复杂一点的查询的,查询 age>16 的记录,并且只显示 name ,语句如下:

select info->‘name’ from name_age where (info->>‘age’)::int4 > 16

关于详细运算符使用,请参考官方文档: 9.15. JSON Functions and Operators

 

修改数据
下面,将 age 从 18 改为 22 ,SQL语句:

SELECT info ||{"age":22}::jsonb from name_age where (info->>id)::int4 = 1

上述用法仅适用于9.5以上,9.5以下需要整个记录更新,不可以单独修改某个值。

当然,上述只是修改了查询结果,修改表实际内容的语句:

UPDATE name_age SET info = info ||{"age":22}::jsonb where (info->>id)::int4 = 1

除了操作符以外,还可以使用函数操作: jsonb_set() ,函数签名如下:

jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])

详细使用可参考 9.15. JSON Functions and Operators

删除数据
删除age这个key,SQL如下:

SELECT info-age from name_age where (info->>id)::int4 = 1

直接用操作符 - 即可。上述同样只是修改了查询结果,如果修改表内容,也需要使用update.

python操作postgres
安装需要的包 pip install psycopg2

新版本的安装方法升级为pip install psycopg2-binary

主要的api接口

1 psycopg2.connect(database="testdb", user="postgres", password="cohondob", host="127.0.0.1", port="5432") 
这个API打开一个连接到PostgreSQL数据库。如果成功打开数据库时,它返回一个连接对象。 

2 connection.cursor()
该程序创建一个光标将用于整个数据库使用Python编程。 

3 cursor.execute(sql [, optional parameters])
此例程执行SQL语句。可被参数化的SQL语句(即占位符,而不是SQL文字)。 psycopg2的模块支持占位符用%s标志 
例如:cursor.execute("insert into people values (%s, %s)", (who, age))

4 curosr.executemany(sql, seq_of_parameters)
该程序执行SQL命令对所有参数序列或序列中的sql映射。 

5 curosr.callproc(procname[, parameters])
这个程序执行的存储数据库程序给定的名称。该程序预计为每一个参数,参数的顺序必须包含一个条目。

6 cursor.rowcount
这个只读属性,它返回数据库中的行的总数已修改,插入或删除最后 execute*().

7 connection.commit()
此方法提交当前事务。如果不调用这个方法,无论做了什么修改,自从上次调用commit()是不可见的,从其他的数据库连接。

8 connection.rollback()
此方法会回滚任何更改数据库自上次调用commit()方法。

9 connection.close()
此方法关闭数据库连接。请注意,这并不自动调用commit()。如果你只是关闭数据库连接而不调用commit()方法首先,那么所有更改将会丢失! 

10 cursor.fetchone()
这种方法提取的查询结果集的下一行,返回一个序列,或者无当没有更多的数据是可用的。

11 cursor.fetchmany([size=cursor.arraysize])
这个例程中取出下一个组的查询结果的行数,返回一个列表。当没有找到记录,返回空列表。该方法试图获取尽可能多的行所显示的大小参数。

12 cursor.fetchall()
这个例程获取所有查询结果(剩余)行,返回一个列表。空行时则返回空列表。

简单的demo

# -*- coding: utf-8 -*-

import psycopg2

import logging


class PyPostgres:
    def __init__(self):
        self.conn = None
        self.cursor = None

    # 链接postgres sql数据库
    def connect(self, host, user, passwd, db, port=5432, charset="utf8"):
        try:
            self.conn = psycopg2.connect(
                "host=%s port=%s dbname=%s user=%s password=%s" % (host, port, db, user, passwd))
            self.cursor = self.conn.cursor()
            logging.info(connect postgres success)
        except Exception as e:
            logging.error(connect postgres database %s error! %s % (db, e))
            return False
        return True

    # 指定sql命令查询
    def query(self, sqlcommand, args=None):
        try:
            self.cursor = self.conn.cursor()
            self.cursor.execute(sqlcommand, args)
            result = self.cursor.fetchall()
        except Exception as e:
            logging.error("postgres query error: %s
 mysql:%s args: %s" % (e, sqlcommand, args))
            return False
        return result

    # 指定sql命令执行
    def execute(self, sqlcommand, args=None):
        try:
            self.cursor = self.conn.cursor()
            if isinstance(args, (list, tuple)) and len(args) > 0 and                     isinstance(args[0], (list, tuple)):
                line = self.cursor.executemany(sqlcommand, args)
            else:
                line = self.cursor.execute(sqlcommand, args)
        except Exception as e:
            # traceback.print_exc()
            logging.error("postgres execute error: %s" % e)
            return False
        return line, self.cursor

    # 提交
    def commit(self):
        self.conn.commit()

    # 回滚
    def rollback(self):
        self.conn.rollback()

    # 关闭链接
    def close(self):
        if self.cursor:
            self.cursor.close()
        if self.conn:
            self.conn.close()
        logging.info(close postgres success)

    # 插入数据
    def insert_data(self, table_name, data_dict):
        data_values = "(" + "%s," * (len(data_dict)) + ")"
        data_values = data_values.replace(,), ))
        db_field = data_dict.keys()
        data_tuple = tuple(data_dict.values())
        db_field = str(tuple(db_field)).replace("", ‘‘)
        sql = """ insert into %s %s values %s """ % (table_name, db_field, data_values)
        params = data_tuple

        self.execute(sql, params)
        self.commit()
        # self.close()


# docker run --name postgres1 -e POSTGRES_PASSWORD=admin -p 5432:5432 -d postgres:latest
# su - postgres
# psql
# CREATE DATABASE IF NOT EXISTS testdb default charset utf8 COLLATE utf8_general_ci;


if __name__ == "__main__":
    py_sql = PyPostgres()
    py_sql.connect(host=127.0.0.1, user=postgres, passwd=adminroot, db=test, port=5432)
    sql = drop table if exists public.member  # 不能使用user ,  因为是postgres关键词
    py_sql.execute(sql)
    py_sql.commit()

    create_table = create table public.member(id integer not null primary key ,username varchar(64) not null,password varchar(64) not null, phone varchar(64));
    py_sql.execute(create_table)
    py_sql.commit()

    insert_data = "insert into public.member(id,username,password,phone) values(1,‘luanpeng‘,‘123456‘,‘112121212‘);"
    py_sql.execute(insert_data)
    py_sql.commit()

    update_data = "update public.member set username=‘luanpeng1‘ where id=1"
    py_sql.execute(update_data)
    py_sql.commit()

    rows = py_sql.query(select * from public.member)
    if rows:
        for row in rows:
            print(row)
            print(id=, row[0], ,username=, row[1], ,password=, row[2], ,phone=, row[3], 
)

    delete_data = "delete from public.member where id=1"
    py_sql.execute(delete_data)
    py_sql.commit()

    truncate_data = "truncate table public.member"
    py_sql.execute(truncate_data)
    py_sql.commit()

 

以上是关于postgres数据库入门, python 操作postgres的主要内容,如果未能解决你的问题,请参考以下文章

postgres之使用python连接并操作

带有事务块的 Python Postgres 查询

centos8下postgreSQL入门3.2.1之无法连接到服务器

postgresql入门

使用 python 对 postgres 执行 upsert 操作,如 pandas to_sql 函数

postgres入门介绍