欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python3---操作数据库(mysql)

程序员文章站 2024-03-21 21:17:22
...

操作MySQL

简介:

  • Python3操作Mysql数据库 可以使用的模块式pymysql 和 MySQLdb。

  • 这两个模块都是通过自己的API执行原生的SQL语句实现的。

  • MySQLdb式最早出现的一个操作MySQL数据库的模块,核心由C语言编写,接口精炼,性能最棒,缺点式环境依赖较多,安装稍复杂,特别是Windows中不好安装,更新较慢

  • pymysql 为替代SQL而生,纯python实现, API的接口与MySQL完全兼容,安装方便。

实验演示

注意:数据库需要在 MySQL 中先创建出来

create database host_info  default charset utf8mb4 collate utf8mb4_general_ci;
  • 注意授权
grant all on *.* to [email protected]'%'  identified by 'Lwq@Lzy123';

安装包 pymysql

  • pymsql是Python中操作MySQL的模块
pip3 install pymysql

基本操作:

  • 创建表
import pymysql
  
# 创建连接
conn = pymysql.connect(
    host='127.0.0.1',  #数据库地址
    port=3306,             # 数据库端口
    user='root',           # 连接数据库的用户
    passwd='123',    # 连接数据库的密码
    db='host_info',   # 数据库的库名,需要先在 MySQL 里创建
    charset='utf8mb4'         # 字符集
)
# 获取游标对象
# cursor = conn.cursor()  
# ((1,), (2,))
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# [{"id": 1}, {"id": 2}]

# 定义 sql 语句, 创建第一个表 服务器基础信息表 base_info
sql = """
create table base_info
 (id int auto_increment primary key, 
  host_name varchar(64) not null, 
  kernel varchar(64),
  os varchar(64),
  manufacturer varchar(32),
  pod_name varchar(64),
  sn varchar(128),
  cpu_name varchar(64)
)"""


# 执行 sql 语句
cursor.execute(sql)
  
# 提交更改
conn.commit()

# 关闭游标对象
cursor.close()

# 关闭连接对象
conn.close()
  • 插入数据
import pymysql
  
# 创建连接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='[email protected]',
    db='host_info',
    charset='utf8mb4'
)

# 获取游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 数据
base_info = {
     "manufacturer": "VMware, Inc.",
     "pod_name": "VMware7,1",
     "sn": "VMware-56 4d 2b 4b 91 1e 48 15-5b d2 73 9c ec 98 da 22",
     "host_name": "qfedu.com",
     "kernel": "3.10.0-957.el7.x86_64",
     "os": "CentOS Linux release 7.6.1810 (Core)",
     "cpu_name": "Intel(R) Core(TM) i5-5350U CPU @ 1.80GHz"
}

# 一次插入一条数据, 并且使用 pymysql 定义的变量占位符
# 编写语句的时候,字段的顺序需要和上面字段的字典中的 key 的顺序一致
sql = '''
 insert into base_info(
   manufacturer,
   pod_name,
   sn,
   host_name,
   kernel,
   os, 
   cpu_name
) values(%s, %s, %s, %s, %s, %s, %s);'''

# 注意这里不是 Python 的字符串格式化,所以传值的时候不需要使用 %
# cursor.execute(sql, ("v1", "v2"))
cursor.execute(sql, tuple(base_info.values()))

# 数据库中受影响的行数
print(cursor.rowcount)

conn.commit()
cursor.close()
conn.close()

一次插入多条数据

import pymysql
  
# 创建连接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='123',
    db='host_info',
    charset='utf8mb4'
)

# 获取游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

base_info = {
     "manufacturer": "VMware, Inc.",
     "pod_name": "VMware7,1",
     "sn": "VMware-56 4d 2d 4c 91 1e 48 15-5b d2 73 9c ec 98 da 22",
     "host_name": "sharkyum.com",
     "kernel": "3.10.0-957.el7.x86_64",
     "os": "CentOS Linux release 7.6.1810 (Core)",
     "cpu_name": "Intel(R) Core(TM) i5-5350U CPU @ 1.80GHz"
}

sql = '''
 insert into base_info(
   manufacturer, pod_name,
   sn, host_name,
   kernel, os, cpu_name
) values(%s, %s, %s, %s, %s, %s, %s);'''


# 语法:
# cursor.executemany(sql, [("v1","v2"), ("v3", "v4")])
"""
datas = []
for d in ...:
   # 把每条数据构造成元组("v1", "v2", 100)
   datas.append(d)

"""
infos = [
   tuple(base_info.values()),
    tuple(base_info.values())
]
cursor.executemany(sql, infos)
print(cursor.rowcount)
conn.commit()
cursor.close()
conn.close()
  • 查询数据
import pymysql, json
  
# 创建连接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='123',
    db='host_info',
    charset='utf8mb4'
)

# 获取游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 定义一个查询语句
query_sql = """
select id, host_name, os 
from base_info 
where id > %s;
"""

# 执行查询语句,并且返回得到结果的行数
row_nums = cursor.execute(query_sql, (1))

"""
获取到数据结果集具有迭代器的特性:
1. 可以通过索引取值,可以切片
2. 结果集中的数据每次取出一条就少一条
"""

# 获取结果集中的第一条数据, 注意不是整个表的第一条数据
one_data = cursor.fetchone()

# 获取结果集中接下来的 2 条数据
many_data = cursor.fetchmany(2)

# 获取结果集中剩余的全部数据 
all_data = cursor.fetchall()

cursor.close()
conn.close()
print("-" * 10)
print(f"共返回数据{row_nums}:")
print("-" * 25)
print(json.dumps(one_data, indent=4))
print("-" * 25)
print(json.dumps(many_data, indent=4))
print("-" * 25)
print(json.dumps(all_data, indent=4))