python中mysql的用法_Python中MySQL用法

2023-11-19

Python中MySQL用法

一、注意事项查看系统版本:arch命令,查看系统是64位还是32位

使用cat /etc/system-release查看内核版本

注意安装MySQL的版本企业版:付费

社区版:免费

MariaDB

注意安装之后避免yum自动更新版本

注意数据库的安全性

二、字符集设置及mysql命令

(一)、字符集设置字符集分类:ASCII:占用一个字节

LATIN:对ASCII做了扩展

GBK:占用一个或两个字节,windows默认的字符集

utf8:占用3个字节,像emoje等占用四个字节的数据无法存储

UTF-8:占用四个字节,在mysql中写法位utf8mb4

查看字符集:show variables like ‘%character%’;mysql> show variables like '%character%';

+--------------------------+----------------------------+

| Variable_name | Value |

+--------------------------+----------------------------+

| character_set_client | utf8mb4 |

| character_set_connection | utf8mb4 |

| character_set_database | utf8mb4 |

| character_set_filesystem | binary |

| character_set_results | utf8mb4 |

| character_set_server | utf8mb4 |

| character_set_system | utf8 |

| character_sets_dir | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+查看校对规则:show variables like ‘collation_%’;mysql> show variables like 'collation_%';

+----------------------+--------------------+

| Variable_name | Value |

+----------------------+--------------------+

| collation_connection | utf8mb4_0900_ai_ci |

| collation_database | utf8mb4_0900_ai_ci |

| collation_server | utf8mb4_0900_ai_ci |

+----------------------+--------------------+

3 rows in set (0.01 sec)_ci表示大小写不敏感,_cs表示大小写敏感配置文件修改mysql字符集命令:vim /etc/my.cnf[client-server]

default_character_set = utf8mb4

[mysql]

default_character_set = utf8mb4

#interactive_timeout = 28800 #针对交互连接的超时时间

#wait_timeout = 28800 #针对非交互连接的超时时间

#max_connections = 1000 #MySQL的最大连接数

#character_set_server = utf8mb4 #MySQL的字符集设置

#init_connect = 'SET NAMES utf8mb4' # 服务器为每个连接的客户端执行的字符串

#character_set_client_handshake = False

#collation_server = utf8mb4_unicode_ci

(二)、mysql常用命令启动服务:systemctl start mysqld.service

查看服务状态:systemctl status mysqld.service

关闭服务:systemctl stop mysqld.service

重启服务:systemctl restart mysqld.service

登陆mysql:mysql -u 用户 -p 密码

更改用户密码:ALTER USER ‘用户名’@‘localhost’ IDENTIFIED BY ‘新密码’

三、Python连接MySQL的API概念:Python语言:Python Database API 或者DB-API

其他语言:连接器、绑定、binding

分类:MySQLdb:Python2的包,适用于MySQL5.5和Python2.7

Python3连接MySQL:mysqlclient:Python3安装MySQLdb的包叫做mysqlclient,但加载的依然是MySQLdb

安装:pip3 install mysqlclient

导入:import MySQLdb

pymysql:pip install pymysql (流行度最高)

Mysql-connector-python:pip install mysql-connector-python (MySQL官方),推荐使用

使用ORM(对原始的DB-API的扩展):sqlalchemypip install sqlalchemy

Django框架Model模型

四、pymysql操作

(一)、查询数据导入pymysql:import pymysql

使用pymysql中的connect方法创建连接对象:参数如下host

user

password

db注意:参数都是关键字参数,如果不是关键字参数,会报如下错误:TypeError: __init__() takes 1 positional argument but 5 were given通过调用连接创建游标对象cursor

调用cursor.execute方法执行sql语句

cursor.fetchone()获取一条数据,fetchall()获取多条数据#!/usr/bin/env python

import pymysql

# 打开数据库连接

db = pymysql.connect(host="47.98.222.6", user="liquanhui01", password="liqh930215", db="testdb")

try:

# 使用cursor方法创建一个游标对象

with db.cursor() as cursor:

sql = 'SELECT * FROM book'

cursor.execute(sql)

books = cursor.fetchall()

for book in books:

print(book)

db.commit()

except Exception as e:

print(f'fetch error {e}')

finally:

db.close()

print(f'Database version : { result }')

(二)、插入数据插入单行数据:value = (数据字读内容),执行方法是:execute(sql, value)

插入多行数据:values = ((数据字段内容1), (数据字段内容2), (数据字段内容3)……),执行方法是:executemany(sql, values)#!/usr/bin/env python

import pymysql

# 打开数据库连接

db = pymysql.connect(host="47.98.222.6", user="liquanhui01", password="liqh930215", db="testdb")

try:

# 使用cursor方法创建一个游标对象

with db.cursor() as cursor:

sql = '''INSERT INTO book (id, name, price) VALUES (%s, %s, %s)''' # 全部用s,无论字段类型

value = (1, "平凡的世界", 23.0) # 传入的值

cursor.execute(sql, value)

db.commit() # 在pymysql中必须使用commit()

except Exception as e:

print(f'fetch error {e}')

finally:

db.close()

print(cursor.rowcount) # rowcount写入的数据的行数(作用的行数,不是表中的总行数)

(三)、更新数据#!/usr/bin/env python

import pymysql

# 打开数据库连接

db = pymysql.connect(host="47.98.222.6", user="liquanhui01", password="liqh930215", db="testdb")

try:

# 使用cursor方法创建一个游标对象

with db.cursor() as cursor:

sql = '''UPDATE book SET name = %s WHERE id = %s'''

value = ("巴黎圣母院", 1)

cursor.execute(sql, value)

db.commit()

except Exception as e:

print(f'fetch error {e}')

finally:

db.close()

print(cursor.rowcount)

(四)、删除数据#!/usr/bin/env python

import pymysql

# 打开数据库连接

db = pymysql.connect(host="47.98.222.6", user="liquanhui01", password="liqh930215", db="testdb")

try:

# 使用cursor方法创建一个游标对象

with db.cursor() as cursor:

sql = '''DELETE FROM book WHERE name = %s'''

value = ("巴黎圣母院")

cursor.execute(sql, value)

db.commit()

except Exception as e:

print(f'fetch error {e}')

finally:

db.close()

print(cursor.rowcount)

(五)、pymysql.connect(参数)参数的传入方式方式一:直接使用关键字参数,传入对应的内容

方式二:把参数写入一个配置文件中,创建方法读取配置文件中的对应内容,返回字典格式,再把字典格式的数据作为参数传入配置文件# config.ini文件

[mysql]

host = 47.98.222.6

user = liquanhui01

password = liqh930215

database = testdb

# 注意:init文件中key对应的值不能添加引号# dbconfig.py文件,该文件中的方法用于读取并返回字典格式的配置参数

from configparser import ConfigParser

from pathlib import Path

p = Path(__file__)

cur_path = p.resolve().parent

file_path = cur_path.joinpath("config.ini")

def read_db_config(filename=file_path, section="mysql"):

# section规定传入哪一部分的内容

# 实例化配置文件解析类,调用该类的read方法获取section对应的文件内容

parser = ConfigParser()

parser.read(filename)

if parser.has_section(section):

items = parser.items(section)

print(items)

else:

raise Exception('{0} not found in the {1} file'.format(section, filename))

return dict(items)

if __name__ == "__amin__":

read_db_config()

# pymysql_cnn.py

#!/usr/bin/env python

import pymysql

from example.dbconfig import read_db_config

dbserver = read_db_config()

print(dbserver)

# 打开数据库连接

db = pymysql.connect(**dbserver)

.....省略

五、sqlalchemy操作

(一)、sqlalchemy core的方式创建数据表导入pymysql

从sqlalchemy中导入create_engine,Table, Column以及其他的字段信息

使用create_engine创建引擎,方法内部为字符串。格式为:engine = create_engine("mysql+pymysql://用户名:密码@域名:端口/数据库", echo=True)

# echo=True开启终端打印模式,在生产模式下需要关闭创建元数据:元数据是对数据库的描述信息,metadata = MetaData(engine)

创建表:变量名 = Table(‘表名’, metadata, 字段信息)

执行metadata.create_all()执行创建表的命令,注意设置异常处理#!/usr/bin/env python

import pymysql

from sqlalchemy import create_engine, Table, Column, Integer, String, ForeignKey, Float, MetaData, DateTime

# 创建引擎

engine = create_engine("mysql+pymysql://liquanhui01:liqh930215@47.98.222.6:3306/testdb", echo=True)

# 创建元数据

metadata = MetaData(engine)

# 创建表

book_table = Table('book', metadata,

Column('id', Integer, primary_key=True),

Column('name', String(100), nullable=False),

Column('desc', String(255), nullable=True),

Column('price', Float, nullable=False)

)

author_table = Table('author', metadata,

Column('id', Integer, primary_key=True),

Column('name', String(30), nullable=False),

Column('book_id', ForeignKey('book.id'), None)

)

try:

metadata.create_all()

except Exception as e:

print(f'create error {e}')

(二)、sqlalchemy orm的方式创建表使用orm方式的四个前提条件:Base必须继承自declarative_base()

使用类创建数据表的时候必须使用属性__tablename__=“表名”的方式设置表名, tablename是双下方法,md文件自动隐藏了下滑线

必须包含一个或者多个Column字段(属性)

必须包含一个主键

导入模块import pymysql

from sqlalchemy import create_engine, Table, Column,字段类型

from sqlalchemy.ext.declarative import declarative_base

创建Base:Base = declarative_base()

创建类,继承自Base,在类中添加__basename__和其他Column属性

创建dbUrl,格式如下:dbUrl = "mysql+pymysql://liquanhui01:liqh930215@47.98.222.6:3306/testdb?charset=utf8mb4"创建引擎:engine = create_engine(dbUrl, echo=True, encoding=“uff-8”)

创建数据表:Base.metadata.create_all(engine)#!/usr/bin/env python

import pymysql

from sqlalchemy import create_engine, Table, Column, Integer, String, Float, DateTime, ForeignKey

from sqlalchemy.ext.declarative import declarative_base

from datetime import datetime

Base = declarative_base()

class Category(Base):

__tablename__ = "category_rom"

id = Column(Integer(), primary_key=True, autoincrement=True)

category_name = Column(String(50), index=True)

class Products(Base):

__tablename__ = "product_rom"

id = Column(Integer(), primary_key=True, autoincrement=True)

product_name = Column(String(50), index=True)

category = Column(Integer, ForeignKey('category_rom.id', ondelete="SET NULL"))

create_on = Column(DateTime(), default=datetime.now)

update_on = Column(DateTime(), default=datetime.now, onupdate=datetime.now)

dburl = "mysql+pymysql://liquanhui01:liqh930215@47.98.222.6:3306/testdb?charset=utf8mb4"

engine = create_engine(dburl, echo=True, encoding="utf-8")

Base.metadata.create_all(engine)

(三)、增删改查操作创建session对象增删改查操作都是基于session进行的

导入:from sqlalchemy.orm import sessionmaker

创建session:# 创建session

from sqlalchemy.orm import sessionmaker

SessionClass = sessionmaker(bind=engine)

session = SessionClass()增加操作class_demo = ClassName(field=“值”, ...)

session.add(class_demo)

session.commit()# 创建session

SessionClass = sessionmaker(bind=engine)

session = SessionClass()

# 添加教师数据

teacher_demo = Teacher(name="李贞贞")

session.add(teacher_demo)

# 添加学生数据

students = ["黎明", "麻织", "杨志", "冉阿让"]

for student in students:

student_demo = Students(name=student)

session.add(student_demo)

session.commit()查询操作获取数据集:查询数据表中的全部字段:使用query = session.query(ClassName)获取数据集,相当于select *

查询一部分字段:使用query = session.query(ClassName.字段名, ClassName.字段名, ...)

使用聚合函数获取查询集:导入func:from sqlalchemy import func

query = session(func.聚合函数名(ClassName.字段名))

对查询的数据做排序操作:升序:query.order_by(ClassName.字段名)

降序:导入desc方法:from sqlalchemy import desc

query.order_by(desc(ClassName.字段名))

对查询的数据集做过滤操作直接写字段条件:query.filter(ClassName.字段+条件, ClassName.字段+条件, …)

使用与、或、非导入:from sqlalchemy import and_, or_, not_, 注意and、or和not后都有一个下滑线,md文件隐藏了

query.filter(or_/and_/not_(ClassName.字段名+条件, ClassName.字段名+条件, ClassName.字段名+条件, ClassName.字段名+条件….))

获取全部数据:query.all(),再通过循环取出

获取单个数据:query.first()获取,或者通过query.one()、query.scale()获取。推荐使用first()

session.commit()data = session.query(Teacher).all()

data = session.query(Students).first()

for result in session.query(Students):

print(result.all())

data = session.query(Students.id, Students.name).order_by(desc(Students.id))

for student in data:

print(student)

query = session.query(Students.id, Students.name).order_by(desc(Students.id)).limit(3)

print([student.name for student in query])

query = session.query(func.count(Students.name)).first()

query = session.query(Students).filter(Students.id > 2, Students.id < 5)

print([[student.id, student.name] for student in query])

query = session.query(Students).filter(or_(

Students.id.between(2, 4),

Students.name.contains("黎")

))

print([student.name for student in query])

session.commit更新数据获取指定数据的数据集:query = session.query(ClassName).filter(ClassName.字段 == 值)

更新数据: query.update({ClassName.字段名: value, ...})

session.commit()query = session.query(Students).filter(Students.id == 3)

query.update({Students.name: "管仲"})

print(query.first())

session.commit()删除数据获取指定数据的数据集:query = session.query(ClassName).filter(ClassName.字段 == 值)

删除数据:方式一:session.delete(query.one())

方式二:query.delete()

session.commit()

六、SQL基础知识select查询时关键字的书写顺序:SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … LIMIT需要注意的是:生产环境下因为列数很多,一般禁用SELECT *

WHERE字段为避免全表扫描,一般需要增加索引select查询时的执行顺序:SELECT DISTINCT player_id, player_name, count(*) as num -- 第五步:从虚拟表中查询出player_id, player_name, count(*)数据

FROM player JOIN team ON player.team_id = team.team_id -- 第一步:从两个表中查询出player.team_id = team.team_id的数据生成一张新的虚拟表

WHERE height > 1.80 -- 第二步:从虚拟表中查询出height>1.80的数据生成新的虚拟表

GROUP BY player.team_id -- 第三步:以player.team_id为条件进行分组

HAVING num > 2 -- 第四步:筛选num > 2的数据

ORDER BY num DESC -- 第六步:根据num的值进行降序排列,升序是asc,降序是desc

LIMIT 2 -- 第七步:取出前两条数据,查询步骤结束

/*

WHERE作用于字段,即每一行数据

HAVING作用于GROUP BY,所有在GROUP BY分组之后如果还要再进行筛选,必须使用HAVING,不能使用WHERE

*/SQL函数:算数函数

字符串函数

日期函数

转换函数

聚合函数COUNT() 行数

MAX() 最大值

MIN() 最小值

SUM() 求和

AVG() 平均值注意:聚合函数忽略空行

子查询概念:需要从查询结果中集中再次进行查询,才可以得到想要的结果,一次无法得到结果

分类关联子查询:复杂,嵌套查询,需要使用EXIST或IN关键字当内层查询表为小表,外层查询表为大表时使用IN关键字SELECT * FROM TABLE_A WHERE condition IN (SELECT condition FROM TABLE_B)

-- A为大表,B为小表,以小表作为优先限制条件可以减少查询的数据量,提升查询的效率- 当内层查询表为大表,外层查询表为小表时使用EXIST关键字

```sql

SELECT * FROM TABLE_A WHERE EXIST (SELECT condition FROM TABLE_B WHERE B.condition = A.condition)

-- B为大表,A为小表,以小表作为优先限制条件可以减少查询的数据量,提升查询的效率

```

- 非关联子查询:简单,内层的语句只执行一次

```sql

SELECT COUNT(*), n_star FROM t1 GROUP BY n_star HAVING n_star > (SEECT avg(n_star) FROM t1) ORDER BY n_star DESC;

```常用的连接(JOIN)自然连接:inner join内部连接,获取两个表的公共部分

ON连接

USING连接

外连接左外连接:leftjoin—>只获取左表中两个表的公共部分数据

右外连接:right join —>只获取右表中两个表的公共部分数据

全外连接(MySQL不支持):获取两个表中的全部数据,由于在MySQL中的不支持,可以使用union来代替

事务执行同步,要么全执行,要么不执行

事务的特性 —— ACIDA:原子性(Atomicity)

C:一致性(Consistency)

I:隔离性(Idolation)

D:持久性(Durability)

事务的隔离级别读未提交:允许读到未提交的数据,级别最低,无法用在高并发场景

读已提交:只能读到已经提交的数据

可重复性:同一事务在相同的查询条件下两次查询的结果一致, 默认事务级别

可串行化:事务进行串行化,排队执行,牺牲了并发性能,级别最高> MySQL中默认自动提交查询自动提交设置:show variables like “autocommit”;

关闭与开启自动提交:关闭:set autocommit = 0

开启:set autocommit = 1

开启事务:BEGIN

提交:COMMIT

回滚:RALLBACK

回滚至某一个保存点:ROLLBACK TO

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中mysql的用法_Python中MySQL用法 的相关文章

随机推荐

  • ICASSP 2023说话人识别方向论文合集

    今年入选 ICASSP 2023 的论文中 说话人识别 声纹识别 方向约有64篇 初步划分为Speaker Verification 31篇 Speaker Recognition 9篇 Speaker Diarization 17篇 An
  • 算法竞赛当中的思考方法——方法论篇。

    方法论 万物皆朴素的第一性原理 几乎任何领域的任何问题的解决方案 都可以看作是 某个结构上的朴素方法的优化 计算机只能处理规模有限的问题 在给定规模且不考虑效率的情况下 问题一定存在朴素解法 具体手段有直接模拟 利用bit枚举 各种搜索算法
  • Spring Cloud面试8连问,谁顶得住?

    问题一 什么是 Spring Cloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序 提供与外部系统的集成 Spring cloud Task 一个生命周期短暂的微服务框架 用于
  • 数据结构-带头双向循环链表的基本实现(C语言,简单易懂,含全部代码)

    链表的概念和结构 概念 链表是一种物理存储结构上非连续 非顺序的存储结构 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 结构 实际中链表的结构非常多样 以下情况组合起来就有8种链表结构 1 单向 双向 2 带头 不带头 3 循环 非循
  • java逆序输出一个整数_Java实现整数的逆序输出(三种方法)

    Java实现整数的逆序输出和C语言相似 下面我介绍三种方法 第一种 无限制整数的逆序输出 import java util Scanner class Cycle01 public static void main String args
  • Tulsi编译失败问题解决

    Tulsi编译失败 Xcode12 4 bazel 4 0 brew 20210218 tulsi最新 解决办法 跑了 usr local Cellar python 2 将这个目录去掉或者改名字为不可用 然后系统默认跑了python3就好
  • Qt—帮助系统

    一个完善的应用程序应该提供尽可能丰富的帮助信息 Qt中可以使用工具提示 状态提示以及 What s This 等简单的帮助提示 也可以使用Qt Assistant来提供强大的在线帮助 简单的帮助提示 已经讲到了工具提示和状态提示 这里简单介
  • java实现第五届蓝桥杯排列序数

    排列序数 如果用a b c d这4个字母组成一个串 有4 24种 如果把它们排个序 每个串都对应一个序号 abcd 0 abdc 1 acbd 2 acdb 3 adbc 4 adcb 5 bacd 6 badc 7 bcad 8 bcda
  • C之(9)函数内联(inline)深入分析

    C之 9 函数内联 inline 深入分析 Author Once Day Date 2023年8月9日 漫漫长路 有人对你微笑过嘛 参考引用文档 Using the GNU Compiler Collection GCC Inline 文
  • 数控技能大赛计算机程序设计员,第八届全国数控技能大赛决赛获奖名单

    近日 由人力资源社会保障部 教育部 科学技术部 中华全国总工会 中国机械工业联合会共同举办的第八届全国数控技能大赛完美落幕 大赛设置数控车工 数控车削加工技术 数控铣工 数控铣削加工技术 加工中心操作工 多轴联动加工技术 数控机床装调维修工
  • Python列表转换成字典、嵌套列表转字典、多个列表转为字典嵌套列表

    目录 两列表转为字典 多列表转为字典嵌套列表 嵌套列表转字典 方法一 直接内置dict 方法二 for循环 一个列表转字典 一 两列表转为字典 list1 key1 key2 list2 value1 value2 print dict z
  • SpringCloud Sentinel集成Gateway和实时监控

    目录 1 Sentinel集成Gateway 1 1 Sentinel对网关支持 1 2 GateWay集成Sentinel 2 Sentinel控制台 2 1 Sentinel控制台安装 2 2 接入控制台 2 3 可视化管理 2 3 1
  • 当使用Vue2+Babel时,如何实现组件重新渲染

    在以前 我们写好静态的 html 后 多数的动态渲染是交给 jquery 来重写的 这样的操作无疑增加了维护的复杂性 于是 我们开始对老系统前端上使用了Vue 2 0 Babel的架构 为什么说Vue比jQuery好呢 这主要从他们的原理着
  • 在Word中给代码添加行号

    说明 有时在Word文档中需要插入一段代码并进行说明 在说明中需要引用代码的某一行 此时可以为这段代码添加行号 应用场景 包含程序代码的作业 论文 报告 步骤 确保段落标记已显示 段落标记是给编辑者看的格式符号 如回车 显示 隐藏段落标记的
  • Win11如何下载安装java?

    一 问题描述 我在复现论文代码的时候 遇到了这样的问题 我没有下载java 那么该如何解决呢 下载 Java 的作用是为了能够在计算机上运行使用 Java 语言编写的应用程序 Java 是一种广泛使用的编程语言 可用于开发各种类型的应用程序
  • CryptoJS与JSEncrypt 加密算法

    crypto js进行AES加密 安装 npm i save crypto js jsencrypt进行RSA加密 安装 npm i save jsencrypt 官网 https github com travist jsencrypt
  • 微软Imagine Cup 2013大赛中国区CSDN高校俱乐部校区比赛成绩及获奖名单

    微软 Imagine Cup 2013 大赛已接近尾声 CSDN高校俱乐部首次参加此大赛 在中国赛区的比赛中 CSDN高校俱乐部校区取得了令人骄傲的成绩 在此向所有的参赛同学表示祝贺和感谢 同时 非常感谢各俱乐部的指导老师 主席 同学对CS
  • 路由期末复习(二)—配置命令

    这篇就专门说说关于配置的知识点 了解基础知识指路 目录 路由器 Telnet服务配置命令 路由器 SSH服务配置命令 SSH配置例子 重点 一图理解SSH配置 用FTP传输文件 使用TFTP传输文件 VLAN的基本配置 配置Hybrid端口
  • APP、软件版本号的命名规范与原则

    APP 软件版本号的命名规范与原则 为了在软件产品生命周期中更好的沟通和标记 我们应该对APP 软件的版本号命名的规范和原则有一定的了解 1 APP 软件的版本阶段 Alpha版 也叫 版 此版本主要是以实现软件功能为主 通常只在软件开发者
  • python中mysql的用法_Python中MySQL用法

    Python中MySQL用法 一 注意事项查看系统版本 arch命令 查看系统是64位还是32位 使用cat etc system release查看内核版本 注意安装MySQL的版本企业版 付费 社区版 免费 MariaDB 注意安装之后