Backend - python 连接 操作 PostgreSQL DB(数据库)

目录

一、基础环境

(一)建立虚拟环境

(二)安装依赖

二、连接数据库

三、操作数据库

(一)查询

(二)单笔更新/插入

(三)批量更新/插入

(四)遇到的问题

1. SQL语句 - 栏位名报错

(1)具体问题

(2)解决

2. SQL语句 - 表不存在

(1)具体问题

(2)解决

3. SQL语句 - 插入的数据格式不正确

(1)具体问题

(2)解决


一、基础环境

(一)建立虚拟环境

        Python 3.10.7

(二)安装依赖

        psycopg2==2.9.9 (在虚拟环境中执行安装)

二、连接数据库

import psycopg2
from psycopg2.extras import execute_values
class ExcuteDB:# ————————————————————————————————————————————— 连接数据库def __init__(self, host, dbname, user, port, password):self.host = hostself.dbname = dbnameself.user = userself.port = portself.password = password# self.conn = self.__postgres  # 连接数据库(放在各种功能方法中,比如exc_query方法)@propertydef __postgres(self):conn = psycopg2.connect(host=self.host,  # 主机地址dbname=self.dbname,  # 数据库名称user=self.user,  # 用户名password=self.password,  # 密码port=self.port)  # 端口号return conn# ————————————————————————————————————————————— 查询def exc_query(self, sql):try:conn = self.__postgres  # 连接数据库cur = conn.cursor()  # 创建游标对象cur.execute(sql)  # 执行SQL语句res_list = Noneres_list = cur.fetchall()  # 获取记录值,结果是列表包元组:[('1F002', '数据结构怎么学'), ('1F001', '数据库原理')]cols_list = [row[0] for row in cur.description]  # 获取栏位名称['card', 'name']data_list = [dict(map(lambda key, value: [key, value], cols_list, val_list)) for val_list in res_list]  # 组装列表包字典:data_list [{'card': '1F002', 'name': '数据结构怎么学'}, {'card': '1F001', 'name': '数据库原理'}]except Exception as e:print(str(e))finally:cur.close()  # 关闭游标conn.close()  # 关闭数据库连接return {'栏位名+栏位值': data_list, '只有栏位值': res_list}# ————————————————————————————————————————————— 单笔更新/插入def exc_edit(self, sql):try:conn = self.__postgres  # 连接数据库cur = conn.cursor()  # 创建游标对象cur.execute(sql)  # 执行SQL语句conn.commit()  # 提交事务except Exception as e:conn.rollback()  # 回滚commit事务print(str(e))finally:cur.close()  # 关闭游标conn.close()  # 关闭数据库连接# ————————————————————————————————————————————— 批量更新/插入def exc_bulk_edit(self, sql_list):try:conn = self.__postgres  # 连接数据库cur = conn.cursor()  # 创建游标对象for l in sql_list:  # 循环不同的sqlsql = l['sql']  # sql语句:'insert into auth_group (card, name, author, btype, price, num) values %s 'args_list = l['args_list']  # 批量插入的值:[('2F0001', '高等数学', '小星星', '教育', 35, 10), ('2F0002', '线性代数', '小星星', '教育', 40, 12)]execute_values(cur, sql, args_list)  # 批量执行conn.commit()  # 提交事务except Exception as e:conn.rollback()  # 回滚commit事务print(str(e))finally:cur.close()  # 关闭游标conn.close()  # 关闭数据库连接

三、操作数据库

(一)查询

exc_db = ExcuteDB('XX.XX.XX.XX', 'bookDB', 'admin', '5432', '123')   # 连接数据库
res = exc_db.exc_query('select card, name from "myApp_book" limit 10')  # 执行查询

(二)单笔更新/插入

exc_db = ExcuteDB('XX.XX.XX.XX', 'bookDB', 'admin', '5432', '123')   # 连接数据库
res2 = exc_db.exc_edit('update "myApp_book" set name=\'数据结构\' where card=\'1F002\' ')  # 执行更新

(三)批量更新/插入

exc_db = ExcuteDB('XX.XX.XX.XX', 'bookDB', 'admin', '5432', '123')   # 连接数据库
res2 = exc_db.exc_bulk_edit([{'sql': 'insert into auth_group (name) values %s ', 'args_list': [('2F0001',), ('2F0002',)]},  # 批量插入auth_group表{'sql': 'insert into "myApp_book" (card, name, author, btype, price, num) values %s ', 'args_list': [('2F0001', '高等数学', '小星星', '教育', 35, 10), ('2F0002', '线性代数', '小星星', '教育', 40, 12)]}  # 批量插入myApp_book表])

(四)遇到的问题

1. SQL语句 - 栏位名报错

(1)具体问题
column "数据结构" does not exist
LINE 1: update "myApp_book" set name="数据结构" where card='1F002'
(2)解决

        数据值不能用双引号括起来,而是用 \'。

        错误写法:

exc_db.exc_query('update "myApp_book" set name="数据结构" where card=\'1F002\' ') 

        正确写法:

exc_db.exc_query('update "myApp_book" set name=\'数据结构\' where card=\'1F002\' ') 

2. SQL语句 - 表不存在

(1)具体问题
relation "myapp_book" does not exist
(2)解决

        表名要用双引号包裹。

        正确写法:

insert into "myApp_book"  …

        错误写法:

insert into myApp_book …

3. SQL语句 - 插入的数据格式不正确

(1)具体问题
INSERT has more expressions than target columns
LINE 1: insert into auth_group (name) values ('2','F','0','0','0','1…
(2)解决

        元组里只有一个数据时,得用逗号结尾。

        正确写法:

[('2F0001',), ('2F0002',)]  # 列表包元组

        错误写法:

[('2F0001'), ('2F0002')]  # 会自动转变为:['2F0001','2F0002']

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/779168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Containerd 介绍、安装和使用

Containerd介绍、安装和使用 文章目录 Containerd介绍、安装和使用1.containerd是什么?2.Containerd安装2.1 主机初始化2.1.1 设置ip地址2.1.2 配置镜像源2.1.3 关闭防火墙2.1.4 禁用SELinux2.1.5 禁用swap2.1.6 设置时区 2.2 安装 containerd2.2.1 内核参数调整2.2…

成都某公司笔试题sql

– 1.某公司需要将项目管理清单导入数据库,请建表,清单字段如下:项目编码,项目名称,项目开始时间,项目结束时间,周期(月),项目金额,客户名称,客户地址,备注。…

【八大排序】一篇文章搞定所有排序

文章目录 1.排序的概念2.常见排序算法的实现2.1 插入排序2.1.1直接插入排序2.1.2希尔排序 2.2选择排序2.2.1直接选择排序:2.2.2堆排序 2.3交换排序2.3.1冒泡排序2.3.2快速排序Hoare法前后指针法挖坑法非递归版本 2.4归并排序递归版本非递归版本 2.5计数排序3.排序的比较 1.排序…

2024年EDM邮件营销群发平台怎么选?

在2024年选择适合的EDM(电子邮件直接营销)邮件营销群发平台时,需要考虑以下几个关键要素来评估云衔科技以及其他供应商的产品或服务是否符合您的需求: 一、功能完备性: 1、智能自动化:确保云衔科技提供的…

用DataGrip连接hive时报错:User: root is not allowed to impersonate plck5,解决方法

你可以尝试关闭主机校验 修改hive安装目录下conf/hive-site.xml,将hive.server2.enable.doAs设置成false <property><name>hive.server2.enable.doAs</name><value>false</value><description>Setting this property to true will have H…

Gitea 的简单介绍

Gitea 是一个基于 Go 语言开发的自助 Git 服务程序。它是一个轻量级的代码托管系统&#xff0c;类似于 GitHub 或 GitLab&#xff0c;可以让你搭建自己的私有 Git 仓库。通过 Gitea&#xff0c;用户可以创建和管理 Git 仓库、进行代码托管、问题追踪、团队协作等操作。Gitea 支…

JQuery基础

JQuery就是封装了js的常用代码 用起来更加简洁方便 使用jQuery前可去官网下载载入js文件 编写第一个jq代码 $(document).ready(function (){ console.log("Hellw,jQuery!") })ready方法与js中的onload事件类似 不过还是有区别的 js的onload事件是在等待页面所有的…

VUE 简单版虚拟列表

如果列表数据有几千几万条的话&#xff0c;一次渲染出来会导致页面卡顿。除了懒加载和分页加载数据还可以使用虚拟列表来解决这个问题。虚拟列表的高度是整个列表实际的高度&#xff0c;但是实际渲染的只是可视窗口部分的内容&#xff0c;通过滚动时&#xff0c;可视区域内部分…

CSRF,XSS攻击与预防

CSRF CSRF&#xff08;Cross-site request forgery&#xff09;跨站请求伪造&#xff0c;也被称为“One Click Attack”或者Session Riding&#xff0c;通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。 在使用Cookie作为登录标记的系统上&#xff0c;Cookie泄露…

0329 ***

给定一个字符串&#xff0c;请你找出其中不含有重复字符的最长连续子字符串的长度 链接 const lengthOfLongestSubstring function(s) {const arr []let maxl 0for(let i 0;i<s.length;i){console.log(s[i])if(arr.indexOf(s[i]) -1){arr.push(s[i])maxl Math.max(m…

警惕.360勒索病毒:如何预防.360勒索病毒攻击

导言&#xff1a; 在网络安全领域&#xff0c;勒索病毒是一种非常危险的恶意软件&#xff0c;它以其独特的加密方式和高昂的赎金要求&#xff0c;给个人和企业带来了严重的损失。.360勒索病毒便是其中之一&#xff0c;它属于BeijingCrypt勒索病毒家族&#xff0c;具有高度的隐…

office安装和卸载

目录 安装文件下载安装破解卸载 安装文件下载 链接&#xff1a;https://pan.baidu.com/s/1cBRv-NwNOf2pQyd7XBRu6A?pwdabcd 提取码&#xff1a;abcd 提供内容如下: ├── pdf │ ├── Access2007宝典.pdf │ ├── Excel2007宝典.pdf │ ├── Project2007完全掌…

python读取ply文件

ply文件&#xff0c;是"Polygon File Format"的简称&#xff0c;即多边形文件格式。一般可以理解为&#xff0c;一个ply文件表示一个三维图形。 python常见的读取ply文件的方法有两个&#xff1a;plyfile和open3d plyfile读取ply文件&#xff1a; 安装ply: pip inst…

scGRN:人与鼠的GRN平台

基因调控网络GRN是包含转录因子TFs与其下游靶基因之间的调控相互作用的可解释图模型。了解GRN的拓扑结构和动力学是解释疾病病因机制和将相应发现转化为新疗法的基础。单细胞多组学技术的最新进展促使从单细胞转录组学和表观基因组学数据中以前所未有的分辨率推断GRN。在这里&a…

ClickHouse03-小白如何快速搭建ClickHouse集群

普通测试通常使用ClickHouse单节点就可以了&#xff0c;但是生产环境不免需要考虑多活、负载等高可用问题&#xff0c;集群就成了基础需求 ClickHouse在集群的选择上&#xff0c;作者已知的有两种&#xff1a; 使用ZooKeeper作为节点协调的组件&#xff0c;使用ClickHouse-Kee…

红米手机Redmi 不会自动弹出USB调试选项,如何处理?(红米小米均适用)

参考&#xff1a; 红米手机Redmi 不会自动弹出USB调试选项&#xff0c;如何处理&#xff1f;&#xff08;红米小米均适用&#xff09; - 知乎 以红米9A为例&#xff1b; 【设置】菜单进入后&#xff0c;找到【我的设备】&#xff0c; 选择【全部参数】&#xff0c; 对准miui版…

SQL96 返回顾客名称和相关订单号(表的普通联结、内联结inner join..on..)

方法一&#xff1a;普通联结 select cust_name, order_num from Customers C,Orders O where C.cust_id O.cust_id order by cust_name,order_num;方法二&#xff1a;使用内连接 select cust_name,order_num from Customers C inner join Orders O on C.cust_id O.cust_id …

测试人员如何提交一条高质量的bug

测试人员在测试软件过程中&#xff0c;发现bug是必然的&#xff0c;那么发现bug后就要提交bug到缺陷管理系统中&#xff0c;如何提交一条高质量的bug&#xff0c;是每一个测试人员值得深思的问题&#xff0c;如果bug提交的不规范&#xff0c;不准确会导致开发人员理解错误&…

Springboot拦截器的使用

* 1、编写一个拦截器实现HandlerInterceptor接口 * 2、拦截器注册到容器中&#xff08;实现WebMvcConfigurer的addInterceptors&#xff09; * 3、指定拦截规则【如果是拦截所有&#xff0c;静态资源也会被拦截】 这段代码定义了一个 LoginInterceptor 类&#xff0c;它实现了…

Python工具箱系列(五十一)

九宫格与词云 对图片进行九宫格切割&#xff0c;并且放到微信朋友圈曾经风靡一时。对于python来说&#xff0c;这个也非常简单。 from PIL import Image import mathdef ninerectanglegrid(inputfilename):"""实现九宫格切割Args:inputfilename (string): 输入…