首页 > 数据库 >Python操作常用数据库

Python操作常用数据库

时间:2023-05-21 10:06:43浏览次数:44  
标签:常用 Python 数据库 查询 cursor result print id


Python操作常用数据库

  • 前言
  • 简介
  • SQLite
  • 连接SQLite
  • 创建数据表
  • MySQL
  • mysql-connector操作MySQL
  • 创建数据表
  • pymysql操作MySQL
  • MongoDB
  • 连接MongoDB
  • Redis
  • 连接Redis

前言

本文是个人使用Python操作常用数据库的学习笔记,由于水平有限,难免出现错漏,敬请批评改正。

简介

  • 数据库可以按照存储模型、关系型/非关系型来进行分类。
  • 关系型数据库:指采用了关系模型来组织数据的数据库。
    关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
  • 当今主流的关系型数据库:Oracle,Microsoft SQL Server,MySQL等。
  • 非关系型数据库:指非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。
  • 当今主流的非关系型数据库:Redis, Amazon DynamoDB, Memcached、MongoDB等。
  • 常用数据库排名,以下数据来源于DB-Engines

SQLite

  • SQLite 是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在 iOS 和 Android的APP中都可以集成。Python 就内置了SQLite3,所以,在 Python 中使用 SQLite,不需要安装任何东西,直接使用。
  • Python 定义了一套操作数据库的 API接口,任何数据库要连接到 Pyton,只需要提供符合 Python标准的数据库驱动即可。由于SQLite的驱动内置在 Python 标准库中,因此可以直接来换作SQLite数据库。
  • 在 Python 中操作数据库时,要先导入数据库对应的驱动,然后通过Connection对象和Cursor对象操作数据。在数据库操作完毕之后,要确保打开的 Connection对象和 Cursor对象都正确地被关闭,否则,资源就会泄露。

连接SQLite

# python连接SQLite
import sqlite3
import os
# 连接到SQLite数据库,如果数据库文件test.db不存在,会自动创建
conn=sqlite3.connect('test.db')
# 创建一个Cursor
cursor=conn.cursor()

创建数据表

# 执行SQL语句,创建user表
cursor.execute('create table IF NOT EXISTS user(id varchar(20) primary key,name varchar(20))')
<sqlite3.Cursor at 0x2c488ea23b0>

# 执行SQL语句,插入记录
li=["Mary","John","Tom"]
for i in enumerate(li,start=1): # start=1表示序号从1开始
    cursor.execute('insert into user (id, name) values (?,?)',(i[0],i[1])) # 增
# 执行查询语句:
cursor.execute('select * from user')
# 获取结果列表
values=cursor.fetchall()
print("查询整个表数据:",values)
查询整个表数据: [('1', 'Mary'), ('2', 'John'), ('3', 'Tom')]

# 执行删除语句:
cursor.execute('delete from user where id=?',('1',)) # 1->?
# 执行查询语句:
cursor.execute('select * from user')
# 获取结果列表
values=cursor.fetchall()
print("查询整个表数据:",values)
查询整个表数据: [('2', 'John'), ('3', 'Tom')]

# 执行修改语句:
cursor.execute('update user set name="Freeman" WHERE id=?',('3',)) # 3->?
# 执行查询语句:
cursor.execute('select * from user')
# 获取结果列表
values=cursor.fetchall()
print("查询整个表数据:",values)
查询整个表数据: [('2', 'John'), ('3', 'Freeman')]

# 执行查询语句:
cursor.execute('select * from user')
# 获取结果列表
values=cursor.fetchall()
print("查询整个表数据:",values)
# 执行查询id为2语句:
cursor.execute('select * from user where id=?',('2',)) # 2->?
# 获取结果列表
values=cursor.fetchall()
print("查询表中id为2的数据:",values)
# 关闭cursor
cursor.close()
# 提交事务
conn.commit()
# 关闭连接
conn.close()
查询整个表数据: [('2', 'John'), ('3', 'Freeman')]
查询表中id为2的数据: [('2', 'John')]

MySQL

  • MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
  • 可以使用 mysql-connector 来连接使用 MySQL, mysql-connector 是 MySQL 官方提供的驱动器。
  • PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2 中则使用 mysqldb。
  • PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。

mysql-connector操作MySQL

# mysql.connector连接MySQL
import mysql.connector
 
conn = mysql.connector.connect(host="localhost",
                               user="root",
                               password="123456",
                               port=3306,
                               database='testdb',
                               auth_plugin='mysql_native_password')
 
cursor = conn.cursor()

创建数据表

cursor.execute("CREATE TABLE IF NOT EXISTS websites (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), url VARCHAR(255))")

sql = "INSERT INTO websites (name, url) VALUES (%s, %s)"
val = [
  ('Google', 'https://www.google.com'),
  ('Github', 'https://www.github.com'),
  ('Taobao', 'https://www.taobao.com'),
]
 
cursor.executemany(sql, val) # 执行多次插入数据
 
conn.commit()    # 数据表内容有更新,必须使用到该语句,提交事务
 
print(cursor.rowcount, "记录插入成功。")
# 执行查询语句:
cursor.execute('select * from websites')
# 获取结果列表
values=cursor.fetchall()
print("查询整个表数据:",values)
4 记录插入成功。
查询整个表数据: [(1, 'Google', 'https://www.google.com'), (2, 'Github', 'https://www.github.com'), (3, 'Taobao', 'https://www.taobao.com'), (4, 

# 执行删除语句:
cursor.execute('delete from websites where id=%s',('2',)) # 2->%s
# 执行查询语句:
cursor.execute('select * from websites')
# 获取结果列表
values=cursor.fetchall()
print("查询整个表数据:",values)
查询整个表数据: [(1, 'Google', 'https://www.google.com'), (3, 'Taobao', 'https://www.taobao.com'),

# 执行修改语句:
cursor.execute('update websites set name="淘宝网" WHERE id=%s',('3',)) # 3->%s
# 执行查询语句:
cursor.execute('select * from websites')
# 获取结果列表
values=cursor.fetchall()
print("查询整个表数据:",values)
查询整个表数据: [(1, 'Google', 'https://www.google.com'), (3, '淘宝网', 'https://www.taobao.com'), 

cursor.execute('select * from websites')
# 获取结果列表
values=cursor.fetchall()
print("查询整个表数据:",values)
# 执行查询id为2语句:
cursor.execute('select * from websites where id=%s',('3',)) # 3->%s
# 获取结果列表
values=cursor.fetchall()
print("查询表中id为3的数据:",values)
# 关闭cursor
cursor.close()
# 关闭连接
conn.close()
查询整个表数据: [(1, 'Google', 'https://www.google.com'), (3, '淘宝网', 'https://www.taobao.com'),
查询表中id为3的数据: [(3, '淘宝网', 'https://www.taobao.com')]

pymysql操作MySQL

# 使用pymysql操作MySQL
import pymysql
# 连接mysql,connect()方法声明一个MySQL连接对象db
conn = pymysql.connect(host='localhost',user='root', password='123456', port=3306, database='testdb')
# 调用cursor()方法获得MySQL的操作游标,利用游标来执行SQL语句
cursor = conn.cursor()
# 执行sql语句,创建数据库的操作,数据库名叫作maotai,默认编码为UTF-8
count = cursor.execute("SELECT * FROM websites")
# 调用fetchall()方法获得所有数据
data = cursor.fetchall()
print('查询整个表数据:\n', data)
print('打印执行SQL语句受影响的行数:',count)
# 关闭cursor
cursor.close()
# 关闭连接
conn.close()
查询整个表数据:
 ((1, 'Google', 'https://www.google.com'), (2, 'Github', 'https://www.github.com'), (3, 'Taobao', 'https://www.taobao.com')
打印执行SQL语句受影响的行数: 4

MongoDB

  • MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。
  • Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接。

连接MongoDB

import pymongo
 
client = pymongo.MongoClient("mongodb://localhost:27017/")
dblist = client.list_database_names() # 查看已有的数据库
print(dblist)
['Test', 'admin', 'config', 'images360', 'local', 'mytest', 'runoobdb', 'taobao', 'taobaomeishi', 'tutorial', 'weibo']

注意:在 MongoDB 中,数据库只有在内容插入后才会创建.

# 在 MongoDB 中,数据库只有在内容插入后才会创建.
db = client['mytest'] #创建一个数据库 
print(db)
collection = db['students'] # 创建一个集合
print(collection)
student = {
    'id': '20220101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}
result = collection.insert_one(student) # 插入一条数据
print(result)

students_list = [
    {'id': '20220102','name': 'Tom','age': 21,'gender': 'male'},
    {'id': '20220103','name': 'John','age': 22,'gender': 'male'},
    {'id': '20220104','name': 'Mary','age': 19,'gender': 'female'},
    {'id': '20220105','name': 'Freeman','age': 18,'gender': 'male'}]

result = collection.insert_many(students_list) # 插入多条数据
print(result)
print(result.inserted_ids)
Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'mytest')
Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'mytest'), 'students')
<pymongo.results.InsertOneResult object at 0x000002C489150D88>
<pymongo.results.InsertManyResult object at 0x000002C489150D08>
[ObjectId('6238738c44d8cba61b1d5451'), ObjectId('6238738c44d8cba61b1d5452'), ObjectId('6238738c44d8cba61b1d5453'), ObjectId('6238738c44d8cba61b1d5454')]

# # 删除
result = collection.delete_one({'name': 'Tom'}) # 删除第一条符合条件的数据
print(result)
print(result.deleted_count) 
result = collection.delete_many({'age': {'$lt': 20}}) # 删除所有age<25的数据
print(result.deleted_count)
<pymongo.results.DeleteResult object at 0x000002C489150E08>
1
2

# 更新或修改
condition = {'age': {'$gt': 20}} # 指定查询条件为年龄大于 20
result = collection.update_one(condition, {'$inc': {'age': 1}}) # {'$inc': {'age': 1}},表示age+1
print(result)
print(result.matched_count, result.modified_count)

condition = {'age': {'$gt': 20}}
result = collection.update_many(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)
<pymongo.results.UpdateResult object at 0x000002C489150DC8>
1 1
<pymongo.results.UpdateResult object at 0x000002C489614E48>
1 1

result = collection.find_one({'name': 'Tom'}) # 查询一条
print(type(result))
print(result)

results = collection.find({'age': 20}) # 查询所有满足条件的数据
print(results)
for result in results:
    print(result)
    
results = collection.find({'age': {'$gt': 20}}) # 用正则表达式查询所有age大于 20 的数据
print(results)
for result in results:
    print(result)
    
results = collection.find({'name': {'$regex': '^T.*'}}) # 用正则表达式查询所有name以T开头的数据
print(results)
for result in results:
    print(result)
<class 'NoneType'>
None
<pymongo.cursor.Cursor object at 0x000002C48961B710>
{'_id': ObjectId('6238738c44d8cba61b1d5450'), 'id': '20220101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}
<pymongo.cursor.Cursor object at 0x000002C48961BA20>
{'_id': ObjectId('6238738c44d8cba61b1d5452'), 'id': '20220103', 'name': 'John', 'age': 24, 'gender': 'male'}
<pymongo.cursor.Cursor object at 0x000002C48961B208>

Redis

  • REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
  • Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
  • Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
  • Redis (REmote Dletionary Server)提供两个类 Redis 和 Strictredis用于实现 Redis 的命令,Strictredis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是 Strictredis的子类,用于向后兼容旧版本的 Redis-Py。
  • Redis 连接实例是线程安全的,可以将 Redis 连接实例设置为一个全局变量,直接使用。如果需要另一个Redis 实例(Redis数据库)时,就需要重新创建 Redis 连接实例来获取一个新的连接。同理,Python的 Redis 没有实现 SELECT 命令。

连接Redis

import redis
from redis import StrictRedis
# 声明了一个StrictRedis对象连接
redis = StrictRedis(host='localhost', port=6379, db=0, password='') # 连接方法一
# redis = redis.Redis(host='localhost', port=6379, db=0, password='') # 连接方法二
# 调用set()方法,设置一个键值对
redis.set('name', 'Tom')
# get()将其获取
print(redis.get('name'))
b'Tom'
# 使用连接池,可以实现多个Redis实例共享一个连接池
from redis import StrictRedis, ConnectionPool

pool = ConnectionPool(host='localhost', port=6379, db=0,password='')
redis = StrictRedis(connection_pool=pool)
# 调用set()方法,设置一个键值对
redis.set('gender', 'male')
# get()将其获取
print(redis.get('gender'))
b'male'

更多精彩内容,可点击进入Python日常小操作专栏查看


标签:常用,Python,数据库,查询,cursor,result,print,id
From: https://blog.51cto.com/u_15953612/6318603

相关文章

  • 你真的了解Python吗?Python一些常见问题总结(一)
    你真的了解Python吗?Python一些常见问题总结(一)前言Python40问参考链接前言本文整理和解答了关于python的一些常见问题,由于水平有限,难免出现错漏,敬请批评改正。Python40问什么是Python?Python-百度百科Python官网Python3菜鸟教程Python是一种解释型语言。这就是说,与C语言和C的......
  • 为什么只有Python可以爬虫,C++可以吗?
    Python(英国发音:/ˈpaɪθən/;美国发音:/ˈpaɪθɑːn/),是一种广泛使用的解释型、面向对象、动态数据类型的高级程序设计语言。Python支持多种编程范型,包括结构化、过程式、反射式、面向对象和函数式编程。它拥有动态类型系统和垃圾回收功能,能够自动管理内存使用,并且其本身拥有一个......
  • Java-Day-23( 线程二:线程终止 + 常用方法 + 用户线程 + 守护线程 + 线程生命周期 + Syn
    Java-Day-23线程终止setLoop()基本说明当线程完成任务后,会自动退出还可以通过使用变量来控制run方法退出的方式停止线程,即通知方式练习使用publicclasstest1{publicstaticvoidmain(String[]args)throwsInterruptedException{Tt1=newT();......
  • Python虚拟环境,多版本共存-windows安装【记录】
    使用virtualenv可以快速创建干净的环境,并且可以指定版本。安装virtualenvpipinstallvirtualenv创建虚拟环境virtualenv-pD:\Python\Python36\python.exevenv36D:\Python\Python36\python.exe可以选择已安装的python版本venv36创建的虚拟环境的目录进入虚拟环境......
  • cmd python pip 笔记
    ......
  • python-asyncio
    python-asyncio目录python-asyncioyieldasyncio中几个重要概念异步代码定义和运行asyncio.run()await()asyncio.create_task()创建Task获取协程返回取消任务多任务控制多任务返回其他知识点run_until_complete实现的原理wait与gather中的区别参考文献协程是在用户态实现的......
  • vscode c++链接mongo数据库的操作随笔
     1、需要先下载安装各种软件及依赖1)c++链接mongo数据库需要涉及到这几个库,而且版本直接有范围boostcmakelibbsonmingwmongo-copensslgccmongocxx  2、vscode安装,用vscode的好处就是会省事情很多1)下载安装vscode2022版本2)也可以用vscode进行安装上面的各种类库......
  • python yield yield from
    pythonyield1:可迭代、迭代器、生成器2:如何运行/激活生成器3:生成器的执行状态4:从生成器过渡到协程:yield可迭代、迭代器、生成器fromcollections.abcimportIterable,Iterator,Generatorisinstance(obj,Iterable)#可迭代对象isinstance(obj,Iterator)......
  • Python潮流周刊#2:Rust 让 Python 再次伟大
    这里记录每周值得分享的Python及通用技术内容,部分为英文,已在小标题注明。(本期标题取自其中一则分享,不代表全部内容都是该主题,特此声明。)文章&教程1、Python修饰器的函数式编程介绍了装饰器的实现原理、带参装饰器、多装饰器、类装饰器和几个典型的示例。文章发布于2014年,代......
  • python中的装饰器原理和作用
    装饰器的作用就是用一个新函数封装旧函数(是旧函数代码不变的情况下增加功能)然后会返回一个新函数,新函数就叫做装饰器,一般为了简化装饰器会用语法糖@新函数来简化例子:这是一段代码,但功能太少,要对这个进行增强,但又不能改变代码。defhello():return"helloworld!"现在我......