psycopg2连接GaussDB(DWS)示例
【摘要】 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)