psycopg2连接GaussDB(DWS)示例

举报
hhx1003 发表于 2022/01/25 09:34:12 2022/01/25
【摘要】 Python拥有简单的语法、动态类型、解释性语言、面对对象编程等特性,可实现跨平台开发,且模块众多、功能强大、可扩展性强。近年来,随着Python版本的不断更新和快速发展,快速占领流行编程语言排行榜,开始用于大型项目的开发。多个数据仓库使用场景中也使用Python开发,使用Python驱动连接数据库。本博文将介绍psycopg2驱动连接GaussDB(DWS)的代码示例和注意问题。

概述

Python拥有简单的语法、动态类型、解释性语言、面对对象编程等特性,可实现跨平台开发,且模块众多、功能强大、可扩展性强。近年来,随着Python版本的不断更新和快速发展,快速占领流行编程语言排行榜,开始用于大型项目的开发。多个数据仓库使用场景中也使用Python开发,使用Python驱动连接数据库。
本博文将介绍psycopg2驱动连接GaussDB(DWS)的代码示例和注意问题。

简单连接查询示例

下面示例代码中分别展示了使用标准游标和RealDictCursor游标查询。

标准游标:返回的是一个元祖,按照查询结果的field排列。

RealDictCursor游标:返回的是一个字典,可根据cursor.description中的列名获取结果。

#!/usr/bin/env python3
# _*_ encoding=utf-8 _*_

import psycopg2
from psycopg2.extras import RealDictCursor

def psycopg2_test():
    # 创建连接
    conn = psycopg2.connect(dbname="testdb",
                            user="jack",
                            password="Abcde@123",
                            host="192.168.233.189",
                            port="8109")

    # 准备数据
    prepare_data_query = """
    drop table if exists student;
    create table student(id int, name varchar(32)) distribute by hash(id);
    insert into student values (1, 'Jack'), (2, 'Tom');
    """
    cursor = conn.cursor()
    cursor.execute(prepare_data_query)
    cursor.close()

    # 使用默认游标执行SQL,查询结果是元祖
    query = "select id, name from student"
    
    print("Start to execute: \"%s\"" % query)
    cursor = conn.cursor()
    cursor.execute(query)
    rows = cursor.fetchall()

    print("Output:")
    print(', '.join([field.name for field in cursor.description]))
    for row in rows:
        print(', '.join([str(e) for e in row]))
    cursor.close()

    # 使用RealDictCursor游标执行SQL,查询结果是字典
    query = "select * from student"

    print("Start to execute: \"%s\"" % query)
    cursor = conn.cursor(cursor_factory = RealDictCursor)
    cursor.execute(query)
    records = cursor.fetchall()
    field_names = [field.name for field in cursor.description]
    cursor.close()

    print("Output:")
    row = 0
    for record in records:
        row += 1
        print("-[ RECORD %d ]-" % row)
        for name in field_names:
            print("%-5s | %-5s" % (name, record[name]))
    print("(%d %s)" % (row, "rows" if row > 1 else "row"))

    conn.close()

if __name__ == '__main__':
    psycopg2_test()

执行结果:

Start to execute: "select id, name from student"
Output:
id, name
1, Jack
2, Tom
Start to execute: "select * from student"
Output:
-[ RECORD 1 ]-
id    | 1    
name  | Jack 
-[ RECORD 2 ]-
id    | 2    
name  | Tom  
(2 rows)

CopyManager插入数据

下面示例代码中展示了使用CopyManager批量导入数据,使用时请注意:

  • cols只有一个的时候,不要使用元组cols = ('id'),否则循环中(例如,for col in cols :),拿到的是单个字符;如果一定使用元组,记得在元组后增加一个逗号,例如 cols  = ('id',)。
  • 组织数据时,一定要满足语法的要求,例如Python 3中要求CopyManager的copy接口需要字符串数据是bytes类型。
#!/usr/bin/env python3
# _*_ encoding=utf-8 _*_

import psycopg2
from pgcopy import CopyManager
from psycopg2.extras import RealDictCursor

def psycopg2_CopyManager():
    # 创建连接
    conn = psycopg2.connect(dbname="testdb",
                            user="jack",
                            password="Abcde@123",
                            host="192.168.233.189",
                            port="8109")

    # 创建表
    create_table_query = """
        drop table if exists student;
        create table student(id int, name varchar(32)) distribute by hash(id);
        """
    cursor = conn.cursor()
    cursor.execute(create_table_query)
    cursor.close()

    # 准备数据
    cols = ['id', 'name']
    records = [(1, b'Jack'), (2, b'Tom'), (3, b'Jerry'), (4, b'Danny')]

    # 使用CopyManager导入数据
    mgr = CopyManager(conn, "student", cols)
    mgr.copy(records)
    conn.commit()

    # 导入结果查询
    query = "select id, name from student order by id"
    cursor = conn.cursor(cursor_factory=RealDictCursor)
    cursor.execute(query)
    records = cursor.fetchall()
    field_names = [field.name for field in cursor.description]
    cursor.close()
    row = 0
    for record in records:
        row += 1
        print("-[ RECORD %d ]-" % row)
        for name in field_names:
            print("%-5s | %-5s" % (name, record[name]))
    print("(%d %s)" % (row, "rows" if row > 1 else "row"))

    # 关闭连接
    conn.close()

if __name__ == '__main__':
    psycopg2_CopyManager()

执行结果:

id    | 1    
name  | Jack 
-[ RECORD 2 ]-
id    | 2    
name  | Tom  
-[ RECORD 3 ]-
id    | 3    
name  | Jerry
-[ RECORD 4 ]-
id    | 4    
name  | Danny
(4 rows)



想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。