当前位置: 首页 > news >正文

python连接数据库

python连接MYSQL、postgres、oracle等的基本操作

python连接mysql

MySQLdb

MySQLdb又叫MySQL-python ,是 Python 连接 MySQL 的一个驱动,很多框架都也是基于此库进行开发,只支持 Python2.x,而且安装的时候有很多前置条件,因为它是基于C开发的库,在 Windows 平台安装非常不友好,经常出现失败的情况,不推荐使用,取代的是它的衍生版本。

Mysqlclient

MySQLdb的 Fork 版本,完全兼容 MySQLdb,同时支持 Python3.x,是 Django ORM的依赖工具,如果你想使用原生 SQL 来操作数据库,那么推荐此驱动。Mysqlclient是一个C扩展模块,编译安装可能会导致报各种错误。
安装:pip install mysqlclient
如果出错,可以查看这个文档 https://blog.csdn.net/cn_1937/article/details/81533544

import MySQLdb
# 注意 这里需要额外导入, 不然会报module 'MySQLdb' has no attribute 'cursors'的错误
import MySQLdb.cursors as cors# 打开数据库连接 
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8',cursorclass=cors.DictCursor) 
# 使用cursor()方法获取操作游标  
cursor = db.cursor() 
# SQL 插入语句 
sql="insert into EMPLOYEE values(%s,%s,%s,%s)" 
try: # 执行sql语句 cursor.executemany(sql,[('Smith','Tom',15,'M',1500),('Mac', 'Mohan', 20, 'M', 2000)]) # 提交到数据库执行 db.commit() 
except: # Rollback in case there is any error db.rollback() 
# 关闭数据库连接 
db.close() 

pymysql包

首先需要安装:pip install pymysql

import pymysqldb = pymysql.connect(host='localhost', user='root', password='mysql',  #连接到数据库需要指定的最少信息db = 'demo', database='demo', #指定选择的数据库,任选一个都可,前面是简写passwd='mysql', #密码也可以用passwd简写形式autocommit=True, #设置修改自动提交到数据库auth_plugin_map='mysql_native_password') #设置身份认证,8.0版本之后建议加上
cursor = db.cursor() #创建一个指针,之后基本所有的操作都是使用指针来实现
cursor.execute('show databases;') #执行SQL语句
db.commit() #将修改提交到数据库——如果连接时参数autocommit设置为false要加上
cursor.fetchall() #获取上一条SQL语句的执行结果,如查询结果等
cursor.fetchone() #获取执行结果的一行
db.close() #关闭数据库

常用的代码就是上面这几行,所以主要还是在使用SQL语句来实现功能。其中主要有两个注意事项:

  • autocommit参数:这个如果不设置的话,默认为false,那么使用execute函数执行SQL语句时就有数据库没有修改的风险,所以建议加上。
  • auth_plugin_map参数:这个也是一个不容易发现的bug,根据StackOverflow上的介绍,在8.0版本之后的MySQL
    server,加上了一个身份验证的东西,和原来的不一样,如果不加上这个参数,可能会出现重启电脑,虽然服务在运行但是无法通过程序连接到数据库。所以保险起见,还是加上这个比较合适。
import pymysqltry:db = pymysql.connect(host='localhost', user='root', passwd='666666', port=3306, db='Mysql8')print('连接成功!')
except:print('something wrong!')
cursor = db.cursor()
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
sql = """CREATE TABLE EMPLOYEE (FIRST_NAME  CHAR(20) NOT NULL,LAST_NAME  CHAR(20),AGE INT,  SEX CHAR(1),INCOME FLOAT )"""cursor.execute(sql)
print('建表成功!')
db.close()

获取操作数据库的异常

在操作数据库时,为了排除异常情况,往往会加上try … except …

try:c = cursor.execute(sql) #指针执行SQL语句
except Exception as e:self.logger.error(f"The SQL code Execution ERROR: "+str(e))return -1

这个句式就能捕捉到sql语句执行时的错误,debug更加方便。

多线程访问数据库 dbutils

当主程序是多线程同时在执行时,且每个线程都需要操作数据,如果只用pymysql实现,相当于一个连接得要一直开着,这样据说运行久了会出问题。因此可以采用dbutils这个第三方模块来实现数据库多连接。
  这个第三方模块的原理就是构造一个数据库的连接池,如果有需要连接就直接去池中申请一个连接,然后使用完再释放。
  使用前先安装:pip install dbutils,调用方式如下所示

from dbutils.pooled_db import PooledDB 
创建连接池

PooledDB 基本参数:

  • mincached : 最少的空闲连接数,如果空闲连接数小于这个数,Pool自动创建新连接;
  • maxcached : 最大的空闲连接数,如果空闲连接数大于这个数,Pool则关闭空闲连接;
  • maxconnections : 最大的连接数;
  • blocking : 当连接数达到最大的连接数时,在请求连接的时候,如果这个值是True,请求连接的程序会一直等待,直到当前连接数小于最- 连接数,如果这个值是False,会报错;
def mysql_connection():maxconnections = 15  # 最大连接数pool = PooledDB(pymysql,maxconnections,host='localhost',user='root',port=3306,passwd='123456',db='test_DB',use_unicode=True)return pool
# use
>> pool = mysql_connection()
>> con = pool.connection()
import pymysql
from DBUtils.PooledDB import PooledDB
import numpy as npclass MysqlPool():config = {'creator': pymysql,'host': 'localhost','port': 3306,'user': 'root','password': 'root','db': 'xiaogenggou','charset': 'utf8','maxconnections': 70,  # 连接池最大连接数量'cursorclass': pymysql.cursors.DictCursor}pool = PooledDB(**config)def __enter__(self):self.conn = MysqlPool.pool.connection()self.cursor = self.conn.cursor()return selfdef __exit__(self, type, value, trace):self.cursor.close()self.conn.close()# 执行函数
def execute(database_commands, s_value=None, i=0):""":param database_commands: 数据库的执行语句:param s_value: %s代表的变量名称:param i: 执行判断符,当i为1时执行状态判断 ,默认值为0"""# 错误捕获,并报错try:with MysqlPool() as db:# 执行操作命令 database_commands:数据库的查询语句 s_value:当查询语句出现%s时%s对应的值,默认为Nonedb.cursor.execute(database_commands, s_value)# 向数据库提交命令db.conn.commit()# 当执行查询操作时打印并返回查询的数据if "select" in database_commands and i == 0:# 打印查询的全部数据,fetchall()的返回值为list格式的字典集print(db.cursor.fetchall())# 返回查询的全部数据return db.cursor.fetchall()elif i == 1:return db.cursor.fetchall()except Exception as e:print("恭喜你,有错,又可以改bug了,开心吗")# 创建表的函数
def test_create():# 编写创建主表main_test的语句sql_create_test = "create table test" \"(user_id int auto_increment primary key," \"username varchar(11)," \"sex nvarchar(1)," \"age int(3)," \"state int(1) DEFAULT 1 )"# 创建表testexecute(sql_create_test)# test_create()# 删除表
def test_table_drop():# 编写删除表的语句sql_test_drop = "drop table test"# 删除表execute(sql_test_drop)# test_table_drop()# 向数据表内插入数据
def test_insert(username, sex, age, table="test"):""":param username: 用户名称:param sex: 用户性别:param age: 用户年龄:param table: 数据表的名称"""# 编写插入语句,%s表示元素的占位符sql_insert = "insert into " + table + " (username,sex,age) values(%s,%s,%s)"# 表示从左到右每个占位符所表示的元素的内容value = (username, sex, age)# 插入数据execute(sql_insert, value)'''
for i in range(10):value_username = "test" + str(i + 1)a = np.random.permutation(2)if a[1] == 1:value_sex = "男"else:value_sex = "女"value_age = int(20 + a[0])test_insert(value_username, value_sex, value_age)'''# 删除user_id对应的元组(用state值为0代替)
def test_delete(user_id):# 判断user_id对应的元组的状态if state_judgement(user_id) == 0:print("该行已被删除")else:# 编写删除语句sql_delete = "update test set state = %s where user_id = %s"# 将state的值改为0,代表删除value = (0, user_id)# 执行删除操作execute(sql_delete, value)'''
for i in range(1, 11):u_id = ia = np.random.permutation(2)print(a[1])if a[1] == 0:test_delete(u_id)
'''# 进行元组状态的判断,1表示存在,0表示已被删除
def state_judgement(user_id):""":param user_id: 判断状态的元组的主键(id):return: 状态判断值"""# 当user_id超出范围时报错try:# 编写判断的语句,%s表示元素的占位符sql_state_judgement = "select state from test where user_id = %s"# 表示从左到右每个占位符所表示的元素的内容value = user_id# 存储返回的listls = execute(sql_state_judgement, value, 1)# 返回代表状态的0或1return ls[0]["state"]except Exception as e:print("亲,错了呢")'''
for i in range(1, 11):print(state_judgement(i))
'''# 更改表test的数据
def test_update(event_attribute, new_value, user_id):""":param event_attribute: 要更改的属性名:param new_value: 更改后的属性内容:param user_id: 更改属性的元组的主键(id)"""# 判断user_id对应的元组的状态if state_judgement(user_id) == 0 and event_attribute != "state":print("该行已被删除")else:# 编写更新语句,%s表示元素的占位符sql_update = "update test set " + event_attribute + " = %s where user_id = %s "# 表示从左到右每个占位符所表示的元素的内容value = (new_value, user_id)# 更改数据execute(sql_update, value)'''
for i in range(1, 11):test_update("age", 40 + i, i)
'''# 查询表test中某一元组的所有的数据
def test_query_all(user_id=None):""":param user_id: 更改属性的元组的主键(id)"""# 当未指定user_id时查询全部元组的数据if user_id is None:# 编写查询语句sql_query_all = "select * from test where state = 1"# 执行查询execute(sql_query_all)else:# 判断user_id对应的元组的状态if state_judgement(user_id) == 0:print("该行已被删除")else:# 编写查询根据user_id确定的某一元组的全部数据sql_query_all = "select * from test where user_id = %s"# 表示从左到右每个占位符所表示的元素的内容value = user_id# 执行查询execute(sql_query_all, value)# test_query_all()# 查询副表test中某一元组的某一属性的数据
def test_query(event_attribute, user_id=None):""":param event_attribute:查询的属性的名称:param user_id: 更改属性的元组的主键(id)"""# 当未指定user_id时查询全部元组的数据if user_id is None:# 编写查询全部元组某一属性的语句sql_query = "select " + event_attribute + " from test where state = 1"# 执行查询execute(sql_query)else:# 判断user_id对应的元组的状态if state_judgement(user_id) == 0:print("该行已被删除")# 编写查询查询根据user_id确定的某一元组的某一属性的数据else:sql_query = "select " + event_attribute + " from test where user_id = %s"# 表示从左到右每个占位符所表示的元素的内容value = user_id# 执行查询execute(sql_query, value)# test_query("username")

总结

pymysql 和 mysqlclient 目前是python连接mysql 的主流方式。mysqlclient 速度比pymysql 更快;pymysql更加简单易使用。

python连接oracle

cx_Oracle

安装:cmd终端,执行 pip install cx_Oracle
依赖:oracle客户端,如果本地没有oracle客户的,就需要获取一个。Oracle Instant Client Downloads
解压后就是一个文件夹(instantclient_21_6),免安装。直接放到一个目录,例如:就直接放到C盘:C:\instantclient_21_6,然后把本地oracle客户端目录更新到环境变量;

import cx_Oracle #导入oracle包
connection =cx_Oracle.connect('aaaaa', 'bbb77', 'xx.xx.xx.xx:1521/SITE') # 数据库连接的用户名、密码、IP、端口和数据库名称。
cursor = connection.cursor() #数据库指针
cursor.execute("""SELECT first_name, last_name FROM employees 
WHERE department_id = :did AND employee_id > :eid""",did = 50,eid = 190)
#或者
sql="select a.* from hs_d.prce a where a.prod_code ='DB3045'" #定义要执行的sql语句
cursor.execute(sql) #执行sql语句
row = cursor.fetchall() #查询回来多条语句
print(row[0]) #打印查询的第一行结果 ---这里如果是测试的话,还可以assert。
print(row[0][2]) #打印结果是:DB3045
assert row[0][2]=="DB3045" #断言返回结果第一行的地3个字段值是“DB3045"

oracledb

import oracledb
import getpassuserpwd = getpass.getpass("Enter password: ")connection = oracledb.connect(user="hr", password=userpwd,dsn="dbhost.example.com/orclpdb")
# 其他功能代码# 关闭连接
connection.close()

或者可以使用以下方法

username="hr"
userpwd = os.environ.get("PYTHON_PASSWORD")
host = "localhost"
port = 1521
service_name = "orclpdb"dsn = f'{username}/{userpwd}@{port}:{host}/{service_name}'
connection = oracledb.connect(dsn)# 其他功能代码# 关闭连接
connection.close()

使用连接池的方法

# 初始化连接
pool = oracledb.create_pool(user="hr", password=userpwd, dsn="dbhost.example.com/orclpdb",min=2, max=5, increment=1)
# Acquire 连接到池
connection = pool.acquire()
# 使用连接池
with connection.cursor() as cursor:for result in cursor.execute("select * from mytab"):print(result)
# 释放连接池
pool.release(connection)
# 关闭连接池
pool.close()

python连接postgres

psycopg2

# -*- coding: utf-8 -*-
import psycopg2
# 获得连接
conn = psycopg2.connect(database="python", user="postgres", password="123456", host="127.0.0.1", port="5432")
# 获得游标对象,一个游标对象可以对数据库进行执行操作
cursor = conn.cursor()
# sql语句 建表
sql ="""SELECT * FROM student;"""
# 执行语句
cursor.execute(sql)
# 抓取
rows = cursor.fetchall()
print(rows)
# 事物提交
conn.commit()
# 关闭数据库连接
cursor.close()
conn.close()

相关文章:

python连接数据库

python连接MYSQL、postgres、oracle等的基本操作 python连接mysql MySQLdb MySQLdb又叫MySQL-python ,是 Python 连接 MySQL 的一个驱动,很多框架都也是基于此库进行开发,只支持 Python2.x,而且安装的时候有很多前置条件&#…...

能不能接受这些坑?买电车前一定要看

图片来源:汽车之家 文 | Auto芯球 作者 | 雷慢 刚有个朋友告诉我,买了电车后感觉被骗了, 很多“坑”都是他买车后才知道的。 不提前研究,不做功课,放着我这个老司机不请教, 这个大冤种他不当谁当&…...

k8s中pod如何排错?

排除Kubernetes Pod故障通常涉及一系列步骤,以诊断问题并找到解决方案。以下是一些常见的故障排除方法: 检查Pod状态: 使用kubectl get pods查看Pod的状态。如果Pod没有处于Running状态,查看更详细的信息,使用kubectl describe …...

【手撕面试题】Vue(高频知识点二)

每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么&…...

四、.Net8对接Ollama实现文字翻译(.Net8+SemanticKernel+Ollama)本地运行自己的大模型

.Net8SemanticKernelOllama 一、Semantic Kernel官方定义SK能做什么? 二、基本使用1、普通对话2、使用插件实现文本翻译功能 三、IChatCompletionService、ITextGenerationService、ITextEmbeddingGenerationService 很多情况都有这样的需求,使用自有系统…...

初始C++

感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步 个人主页:LaNzikinh-CSDN博客 文章目录 前言一.引用二.内联函数三.类和对象总结 前言 之前讲c的命令空间和第一个程序的运行,继…...

Chapter 5 Current Mirrors and Biasing Techniques

Chapter 5 Current Mirrors and Biasing Techniques 这一章介绍电流镜 5.1 Basic Current Mirrors MOS工作在饱和区, 表现为一个电流源. 考虑电源变化, PVT波动, 我们会首先产生一路精准电流源, 再复制这路电流. 如何复制呢? 电流转电压再转电流就行了, 如下图所示 考虑到…...

Avalonia Image控件上通过鼠标拖动画出矩形框

注册鼠标事件&#xff1a;首先&#xff0c;你需要注册 Image 控件上的鼠标事件&#xff0c;包括 PointerPressed、PointerMoved 和 PointerReleased。你可以在 XAML 文件或代码中注册这些事件。 <Image PointerPressed"Image_PointerPressed" PointerMoved"…...

Wireshark Lua插件入门

摘要 开发中经常通过抓包分析协议&#xff0c;对于常见的协议如 DNS wireshark 支持自动解析&#xff0c;便于人类的理解&#xff0c;对于一些私有协议&#xff0c;wireshark 提供了插件的方式自定义解析逻辑。 1 动手 废话少说&#xff0c;直接上手。 第一步当然是装上wiresh…...

XXE漏洞简介

目录 漏洞原理 漏洞危害 前置知识 XML简介 DTD简介 DTD的两种声明方式 实体 实体分类 内置实体(Built-inentities) 字符实体&#xff08;Characterentities&#xff09; 通用实体&#xff08;Generalentities&#xff09; 参数实体(Parameterentities) XXE漏洞…...

小白跟做江科大32单片机之蜂鸣器

1.复制之前编写的工程库项目&#xff0c;详细工程库创建过程如下链接&#xff1a; 小白跟做江科大32单片机之LED闪烁-CSDN博客https://blog.csdn.net/weixin_58051657/article/details/139295351?spm1001.2014.3001.55022.按照江科大老师给的图片进行连接蜂鸣器 接线时要用公…...

IsoBench:多模态基础模型性能的基准测试与优化

随着多模态基础模型的快速发展&#xff0c;如何准确评估这些模型在不同输入模态下的性能成为了一个重要课题。本文提出了IsoBench&#xff0c;一个基准数据集&#xff0c;旨在通过提供多种同构&#xff08;isomorphic&#xff09;表示形式的问题&#xff0c;来测试和评估多模态…...

MyEclipse使用教程

MyEclipse使用教程如下&#xff0c;按照以下步骤&#xff0c;您可以逐步熟悉并掌握MyEclipse的基本使用&#xff1a; 一、MyEclipse安装与准备 软件准备&#xff1a; 在使用MyEclipse之前&#xff0c;您需要确保已经安装了JDK&#xff08;Java Development Kit&#xff09;。J…...

TiDB学习9:Ti Cloud简介

目录 1. 为什么选择TiDB 2. 多租户 3. TiDB架构 4. 什么是TiDB Cloud 5. TiDB Cloud Provider Region 6. TiDB Cloud 入门 6.1 在浏览器中打开TiDB Cloud 6.2 创建您的账户 6.3 Developer Tier 与Dedicated Tier 6.3.1 Developer Tier 6.3.2 Dedicated Tier 6.3.2.…...

JavaScript 创建新节点的方法

在 JavaScript 中&#xff0c;可以使用 document.createElement() 方法来创建新的节点。该方法接受一个字符串参数&#xff0c;表示要创建的节点类型&#xff0c;如 "div"、"p" 等。 创建一个新节点的基本步骤如下&#xff1a; 使用 document.createElem…...

在phpstorm2024版里如何使用Jetbrains ai assistant 插件 ?

ai assistant激活成功后&#xff0c;如图 ai assistant渠道&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上&#xff0c;Google 为 Android Studio 推出了 Studio Bot 功能&#xff0c;使用了谷歌编码基础模型 Codey,Codey 是…...

进程间通信(27000字超详解)

&#x1f30e;进程间通信 文章目录&#xff1a; 进程间通信 进程间通信简介       进程间通信目的       初识进程间通信       进程间通信的分类 匿名管道通信       认识管道       匿名管道       匿名管道测试       管道的四种…...

一、大模型推理

https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md https://github.com/hiyouga/LLaMA-Factory/blob/main/examples/README_zh.md 安装 v7.1 https://github.com/hiyouga/LLaMA-Factory/releases/tag/v0.7.1 git clone --depth 1 https://github.com/hiyoug…...

.NET IoC 容器(三)Autofac

目录 .NET IoC 容器&#xff08;三&#xff09;AutofacAutofacNuget 安装实现DI定义接口定义实现类依赖注入 注入方式构造函数注入 | 属性注入 | 方法注入注入实现 接口注册重复注册指定参数注册 生命周期默认生命周期单例生命周期每个周期范围一个生命周期 依赖配置Nuget配置文…...

Day44 动态规划part04

背包问题 01背包问题&#xff1a;每件物品只能用一次完全背包问题&#xff1a;每件物品可以使用无数次 01背包问题 暴力解法&#xff1a;每一件物品其实只有两个状态&#xff0c;取或者不取&#xff0c;所以可以使用回溯法搜索出所有的情况&#xff0c;那么时间复杂度就是 o…...

html期末复习速览

一.基础标签 1.段落标签<p></p> 特点&#xff1a;分段分割 2.标题标签<h1></h1>……<h6></h6> 特点&#xff1a;文字加粗&#xff0c;单独占一行 3.换行标签<br /> 特点&#xff1a;单标签&#xff0c;强制换行 二.文本格式化…...

CTFHUB-信息泄露-目录遍历和PHPINFO

目录 目录遍历 PHPINFO 目录遍历 很简单&#xff0c;挨着把每个目录都点开看一下 发现2目录下有个 flag.txt 文件&#xff0c;点开发现了本关的flag PHPINFO 这关也很简单&#xff0c;进来之后是一个phpinfo页面&#xff0c;按 CTRL F键打开查询&#xff0c;输入flag&#…...

面向Java程序员的Go工程开发入门流程

对于一个像我这样没有go背景的java程序员来说&#xff0c;使用go开发一个可用的程序的速度是肉眼可见的缓慢。 其难点不在于go语言本身&#xff0c;而是搭建整个工程链路的过程&#xff0c;即所谓的“配环境”。 本文主要讲述如何配出一个适合go开发的环境&#xff0c;以免有同…...

vue3开发高德地图

在vue3的index.html 使用动态注入地址名和key <html lang"en"><head><meta charset"UTF-8" /><link rel"icon" type"image/svgxml" href"/vite.svg" /><meta name"viewport" conten…...

通过DLL方式链接glfw3.dll

主要是CMakeLists.txt文件变化 cmake_minimum_required(VERSION 3.10) project(glfwTest) set(CMAKE_CXX_STANDARD 11) aux_source_directory(. SRC_SOURCES) set(GLFW_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include) set(GLFW_LIBRARY_DIR ${CMAKE_SOURCE_DIR}/lib/glfw) add_ex…...

Python自然语言处理(NLP)库之NLTK使用详解

概要 自然语言处理(NLP)是人工智能和计算机科学中的一个重要领域,涉及对人类语言的计算机理解和处理。Python的自然语言工具包(NLTK,Natural Language Toolkit)是一个功能强大的NLP库,提供了丰富的工具和数据集,帮助开发者进行各种NLP任务,如分词、词性标注、命名实体…...

sqoop操作

介绍 sqoop是隶属于Apache旗下的, 最早是属于cloudera公司的,是一个用户进行数据的导入导出的工具, 主要是将关系型的数据库(MySQL, oracle...)导入到hadoop生态圈(HDFS,HIVE,Hbase...) , 以及将hadoop生态圈数据导出到关系型数据库中 操作 将数据从mysql中导入到HDFS中 1.全量…...

【Qt秘籍】[002]-开始你的Qt之旅-下载

一、Qt的开发工具有哪些&#xff1f; Qt的开发工具概述Qt支持多种开发工具&#xff0c;其中最常见的开发工具是 1.QtCreator 【易上手/有少量bug/适合新手】 2.VisualStudio 【功能强大/易出错/需要更多额外配置】 3.Eclipse 【清朝老兵IDE/不建议使用】 【注意&#xff1…...

【自动驾驶】点与向量从ego系转odometry系

1.点从ego系转odometry系(ego -> odometry) struct Point {float x;float y;float angle; }; Point trans; // is the odom to ego transform Point odom_coord; is the odom coord Point ego_coord; is the ego coordfloat odom_coord.x = (ego_coord.x - trans.x) * st…...

jsmug:一个针对JSON Smuggling技术的测试PoC环境

关于jsmug jsmug是一个代码简单但功能强大的JSON Smuggling技术环境PoC&#xff0c;该工具可以帮助广大研究人员深入学习和理解JSON Smuggling技术&#xff0c;并辅助提升Web应用程序的安全性。 背景内容 JSON Smuggling技术可以利用目标JSON文档中一些“不重要”的字节数据实…...