Python 连接 PostgreSQL 数据库

news/2024/12/23 7:00:07/

Psycopg 是最受欢迎的用于连接 PostgreSQL 的 Python 驱动库, Psycopg 完全遵守 Python DB API 2.0 规范, 并且是线程安全的, 在底层直接调用 C 库 libpq

安装

$ sudo apt install libpq-dev
$ pip install psycopg2-binary

简单示例

import psycopg2# 连接 PostgreSQL
conn = psycopg2.connect(host='127.0.0.1', port=5432, dbname='gorm', user='jianghuixin',password='123456'
)
cursor = conn.cursor()# 执行 SQL 查询
cursor.execute("SELECT * FROM user_infos")# 获取 SQL 结果
records = cursor.fetchall()
print(records)# 关闭连接
cursor.close()
conn.close()

使用

connect() 函数创建一个数据库的 session, 并返回一个 connection 实例

  1. connection 实例支持:
  • 使用 cursor() 方法创建 cursor 实例
  • 事务操作例如 commit() 或 rollback() 方法
  1. cursor 实例支持:
  • 通过 execute() 与 executemany() 方法执行 SQL 语句
  • 遍历 cursor 获取 SQL 查询的数据, 或者调用 fetchone(), fetchmany(), fetchall() 方法

connection 和 cursor 均支持 with 语句

import psycopg2TABLE = "demo"# 连接 PostgreSQL
dsn = "host=127.0.0.1 port=5432 dbname=gorm user=jianghuixin password=123456"
with psycopg2.connect(dsn) as conn:with conn.cursor() as cursor:# 创建 demo 表cursor.execute(f"CREATE TABLE {TABLE} (id serial PRIMARY KEY, name VARCHAR(10), age INT)")cursor.executemany(f"INSERT INTO {TABLE}(name, age) VALUES(%s, %s)",[('David', 15), ('Alice', 25)])conn.commit()# 获取 SQL 结果cursor.execute(f"SELECT * FROM {TABLE}")records = cursor.fetchall()print(records)

SQL 传参

在 execute() 和 executemany() 方法中, 第一个参数为 SQL 语句, 可以包含多个 %s 占位符, 第二个参数为元组或列表, 给 SQL 语句中的 %s 依次传递数据

>>> cur.execute("""
...     INSERT INTO some_table (an_int, a_date, a_string)
...     VALUES (%s, %s, %s);
...     """,
...     (10, datetime.date(2005, 11, 18), "O'Reilly"))

对应的 SQL 语句为:

INSERT INTO some_table (an_int, a_date, a_string)
VALUES (10, '2005-11-18'::date, 'O''Reilly');

可以通过 cursor.mogrify() 方法查看, 占位符被替换以后完整的 SQL 语句

>>> cursor.mogrify("""
...:     INSERT INTO some_table (an_int, a_date, a_string)
...:     VALUES (%s, %s, %s);
...:     """,
...:     (0, datetime.date(2005, 11, 18), "O'Reilly"))
b"\n    INSERT INTO some_table (an_int, a_date, a_string)\n    VALUES (0, '2005-11-18'::date, 'O''Reilly');\n    "

注意占位符只能使用 %s, 即使数据是整数, 也不能使用 %d


execute() 方法的第二个参数也可以是字典, 占位符需要改为 %(name)s, name 为字典的键

d = {'language': 'C++', 'year': 35}
cursor.execute("INSERT INTO demo(name, age) VALUES(%(language)s, %(year)s)", d)

在 SQL 语句中, 如果要传递表名或字段名, 不能使用 %s 占位符机制, 因为 %s 会给字符串加上双引号, 得到的是错误的 SQL 语句

FIELD = 'name'cursor.execute("SELECT %s FROM demo", (FIELD,)) # 错误cursor.execute("SELECT %s FROM demo" % FIELD) # 正确(使用 % 运算符)
cursor.execute(f"SELECT {FIELD} FROM demo")   # 正确(使用 f-string)

http://www.ppmy.cn/news/85921.html

相关文章

性能测试计划不会写?我告诉你有模板你看不看

目录 1 简介 2 测试进入条件 3 测试退出条件 4 性能测试需求 5 测试风险 6 测试时机 7 测试策略 8 测试资源 9 测试进度 10 交付物 1 简介 1.1 目的 【描述性能测试计划的目的。】 1.2 背景 【描述项目或产品的背景。】 1.3范围 【描述性能测试的整体范围。】 2 测试进入条件 【…

Github疯传!200本经典计算机书籍!

好书在精不在多,每一本经典书籍都值得反复翻阅,温故而知新! 下面分享几本计算机经典书籍,都是我自己看过的。 重构 改善既有代码的设计 就像豆瓣评论所说的,看后有种醍醐灌顶、欲罢不能的感觉。无论你是初学者&#…

STM32开发(二十二)STM32F103 高级外设 —— 灵活的静态存储器控制器FSMC 详解

👈《上一篇》  🏡《主目录》  👉《下一篇》 文章目录 FSMC功能描述FSMC特性FSMC框图外部设备地址映像NOR和PSRAM地址映像外部存储器地址SRAM/PSRAM控制器时序图大家都知道,当电脑运行比较卡的时候,我们可以通过给电脑加装内存条来改善电脑的性能。那么STM32能否扩展内…

【数据安全-02】AI打假利器数字水印,及java+opencv实现

AIGC 的火爆引燃了数字水印,说实话数字水印并不是一项新的技术,但是这时候某些公司拿出来宣传一下特别应景,相应股票蹭蹭地涨。数字水印是什么呢,顾名思义,和我们在pdf中打的水印作用差不多,起到明确版权、…

2023暑期实习历程总结

一.前言 Hello 大家好久不见,已经三个月左右没有更新了,那我这三个月在干什么呢?自2023年3月中旬开始到现在五月底这期间接近三个月的时间里,我一直在进行2023暑期实习的投递和面试。这期间投递了包括各大中厂(阿里&am…

网络层:IP协议

本博文分享的是网络层的IP协议,从IP协议的基本概念、协议格式开始分析并分享出来。 IP协议的基本概念 不同于讨论TCP/UDP时只讨论通信主机之间的关系,在讨论IP协议中,会加上主机之间的网络来一起进行讨论分析。 主机:一般配有IP地址&#xf…

读书:《马上写出好文章》

本书作者是金兰伯特(Kim Lambert)。 1. 激励读者的关键要素 定义你的目标读者是谁,并思考他们的需求和期望。确定你想要激发读者的何种反应和情感。与读者建立心理共鸣的方法,了解他们的想法和需求。通过市场研究和反馈机制来了解你的目标读…

力扣贪心算法专题(三)力扣题 452、435、763、56、738、968、714 思路及C++实现

文章目录 贪心算法452. 用最少数量的箭引爆气球435. 无重叠区间做法1 右边界排序 不重叠区间做法2 右边界排序 不重叠区间做法3 左边界排序 重叠区间 763.划分字母区间做法1做法2 56. 合并区间738.单调递增的数字暴力解法贪心算法 968.监控二叉树714.买卖股票的最佳时机含手续费…