使用Python操作MySQL快速入门教程

2024-01-02 22:48:59

说明

  • Python版本:3.12
  • Pycharm版本:2023.3
  • MySQL版本:8.0.25
  • zdppy_mysql版本:0.1.0

本套教程配有录播课,价格是188.99元,如果有需要,欢迎微信18010070052购买,配有完整的代码和相关资料以及文档。

Docker部署MySQL8

说明:Docker部署MySQL8主要是简单快速,不会对电脑系统造成污染。假如你的本地没有Docker,或者你不会使用Docker,则使用phpstudy去启动MySQL,或者直接在本机安装MySQL都是可以的。最重要的是,你要有一个MySQL8的环境,并且你必须要知道数据库的主机地址,端口号,用户和密码等关键信息。

拉取镜像:

docker pull mysql:8.0.25

移除可能存在的镜像和容器:

docker stop mysql
docker rm mysql

创建一个新的容器:

  • --restart=always:表示开机的时候,会自动重启
  • -p 3306:3306:表示宿主机的3306端口,绑定到容器的3306端口,进行了一次端口的转发
  • --name mysql:表示容器名叫mysql
  • -e MYSQL_ROOT_PASSWOR=zhangdapeng520:表示我们设置的root用户的密码是zhangdapeng520
  • -d:表示后台启动
  • mysql:8.0.25:表示MySQL的镜像以及版本
# 示例
docker run --restart=always -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=zhangdapeng520 -d mysql:8.0.25

# 示例2
docker run --restart=always -p 3307:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=zhangdapeng520 -d mysql:8.0.25

参数解析:

  • 用户名:root
  • 密码:zhangdapeng520
  • 端口:3306

创建数据库

创建数据库的名字叫做zdppy_mysqldemo,这一步在其他的编程语言中,通常需要手动创建。但是我们的zdppy_mysql很强大,支持直接通过Python编程语言去创建数据库。*

注意点:

  • 创建数据库对象的时候,尽量不要指定数据库的名字
  • 如果数据库已存在,可能会报错
  • 如果你想要强制创建数据库,你可以选择先删除该数据库,然后再创建该数据库
  • zdppy_mysql提供了强制创建数据库的方法,但是该方法是不安全的,假如你的数据库里面有大量的数据,可能会被直接清空,有可能会造成无法估量的损失

Database的参数解析:

  • host:数据库的IP地址,或者主机域名
  • port:数据库的端口号
  • database:要连接的数据库名
  • username:用户名
  • password:密码

要实现添加数据库的功能,核心是调用db.add_database()方法,括号里面传一个字符串,这个字符串表示的是要创建的数据库名字。需要注意的是,你的数据库名要符合命名规则,尽量不要包含特殊符号,否则可能会报错。

示例代码:

from mysql.db_object import Database

db = Database(
    host="127.0.0.1",
    port=3306,
    database="",
    username="root",
    password="zhangdapeng520",
)
print(db.get_all_database())

# 添加数据库
db.add_database("zdppy_mysql_demo")

# 再次查看
print(db.get_all_database())

安装依赖

pip install zdppy_mysql-0.1.0.tar.gz

查看所有数据库

要查看所有数据库,我们只需要调用db.get_all_database就可以了。这个方法,返回的是一个数组,这个数组里面的元素是字符串,每个字符串代表一个数据库的名字。*

示例代码:

from mysql.db_object import Database

db = Database(password="zhangdapeng520")
print(db.get_all_database())

删除数据库

要删除数据库,我们只需要调用db.delete_database(xxx)就可以了,这里的xxx应该是一个字符串,代表的是要删除的数据库的名字。

示例代码:

from mysql.db_object import Database

# 创建数据库对象
database_name = "test"
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)

# 创建数据库
db.add_database(database_name)

# 查看所有数据库
print("删除前:", db.get_all_database())

# 删除数据库
db.delete_database(database_name)

# 查看所有数据库
print("删除后:", db.get_all_database())

查看所有表格

要实现查看所有的表格,我们只需要调用db.get_all_table()就可以了。这个方法,返回的是一个数组,数组里面的元素是字符串,每个字符串元素代表的是表格的名称。

这个方法,和db.get_all_database()很像,大家记忆的时候,可以联合起来一起记,记成db.get_all_xxx就可以了。

一定要注意,在创建数据库的时候,我们没有指定数据库的名称,也就是database=""。假如我们接下来想要操作表格,就一定要指定数据库,否则就会报错。所以,此时,我们应该给db对象重新赋值。

示例代码;

from mysql.db_object import Database

# 创建数据库对象
database_name = "test"
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)

# 创建数据库
db.add_database(database_name)

# 给db重新赋值
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)

# 查看所有的表格
print(db.get_all_table())

# 删除数据库
db.delete_database(database_name)

创建表格

要创建表格,我们必须要自己准备好一个建表的SQL语句。然后调用db.execute(sql)去执行建表的SQL语句,以达到创建表格的目的。

比如,我们创建一个简单的用户表,SQL语句如下:

create table user(id int primary key auto_increment, name varchar(36))

示例代码:

from mysql.db_object import Database

# 创建数据库对象
database_name = "test"
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)

# 创建数据库
db.add_database(database_name)

# 给db重新赋值
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)

# 创建表格
sql_str = "create table user(id int primary key auto_increment, name varchar(36))"
db.execute(sql_str)

# 查看所有的表格
print(db.get_all_table())

# 删除数据库
db.delete_database(database_name)

强制添加数据库

强制添加数据库,指的是如果数据库存在,先删除该数据库,然后再创建该数据库,是一种非常危险的操作,适合用于想要初始化某个数据库的时候。

假想一个场景:

  • 先创建数据库
  • 接着创建一张表
  • 此时,再创建该数据库,查看所有表,该表应该还在,因为数据库存在的时候,再添加数据库不会受到影响
  • 但是,我们强制添加该数据库,再查看所有表,该表应该已经消失,因为该数据库被删除了一次,库里面所有的数据都没了

示例代码:

from mysql.db_object import Database

# 创建数据库对象
database_name = "test"
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)

# 创建数据库
db.add_database(database_name)

# 给db重新赋值
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)

# 创建表格
sql_str = "create table if not exists user(id int primary key auto_increment, name varchar(36))"
db.execute(sql_str)

# 此时,再创建该数据库,查看所有表,该表应该还在,因为数据库存在的时候,再添加数据库不会受到影响
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)
db.add_database(database_name)
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)
print(db.get_all_table())

# 但是,我们强制添加该数据库,再查看所有表,该表应该已经消失,因为该数据库被删除了一次,库里面所有的数据都没了
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)
db.add_database_force(database_name)
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)
print(db.get_all_table())

# 删除数据库
db.delete_database(database_name)

添加数据

要实现添加数据,我们只需要调用db.add(表名,[要新增的字段], [每个字段对应的值])就可以了。

示例代码:

from mysql.db_object import Database

# 创建数据库对象
database_name = "test"
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)

# 创建数据库
db.add_database(database_name)

# 给db重新赋值
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)

# 创建表格
sql_str = "create table user(id int primary key auto_increment, name varchar(36))"
db.execute(sql_str)

# 添加数据
table = "user"
columns = ["name"]
values = ["张三"]
db.add(table, columns, values)

# 删除数据库
db.delete_database(database_name)

获取所有数据

要获取所有的数据,我们只需要执行db.get_all(表格名)就可以了。返回值是一个列表,列表中的元素是字典,每个字典包含了一条数据,key是列名,value是列名对应的值。

示例代码:

from mysql.db_object import Database

# 创建数据库对象
database_name = "test"
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)

# 创建数据库
db.add_database(database_name)

# 给db重新赋值
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)

# 创建表格
sql_str = "create table user(id int primary key auto_increment, name varchar(36))"
db.execute(sql_str)

# 添加数据
table = "user"
columns = ["name"]
values = ["张三"]
db.add(table, columns, values)

# 查看所有数据
data = db.get_all(table)
print(data, type(data))

# 获取每一个值
for u in data:
    print(u.get("id"), u.get("name"))

# 删除数据库
db.delete_database(database_name)

批量添加数据

要实现批量添加数据,实际上也很简单。我们只需要调用db.add_many(表格名,[列名], [[每一列的值],...])

批量添加用户的核心代码如下:

table = "user"
columns = ["name"]
values = [["张三"], ["李四"], ["王五"]]
db.add_many(table, columns, values)

完整示例代码:

from mysql.db_object import Database

# 创建数据库对象
database_name = "test"
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)

# 创建数据库
db.add_database(database_name)

# 给db重新赋值
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)

# 创建表格
sql_str = "create table user(id int primary key auto_increment, name varchar(36))"
db.execute(sql_str)

# 批量添加数据
table = "user"
columns = ["name"]
values = [["张三"], ["李四"], ["王五"]]
db.add_many(table, columns, values)

# 查看所有数据
data = db.get_all(table)
print(data)

# 删除数据库
db.delete_database(database_name)

更新数据

更新数据,实际上也特别简单。我们只需要调用db.update(表格, id, [列名], [值])方法就可以了。

修改用户数据的核心代码如下:

db.update(table, 1, columns, ["张三333"])

完整示例代码:

from mysql.db_object import Database

# 创建数据库对象
database_name = "test"
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)

# 创建数据库
db.add_database(database_name)

# 给db重新赋值
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)

# 创建表格
sql_str = "create table user(id int primary key auto_increment, name varchar(36))"
db.execute(sql_str)

# 批量添加数据
table = "user"
columns = ["name"]
values = [["张三"], ["李四"], ["王五"]]
db.add_many(table, columns, values)

# 修改张三  张三333
db.update(table, 1, columns, ["张三333"])

# 查看所有数据
data = db.get_all(table)
print(data)

# 删除数据库
db.delete_database(database_name)

删除数据

要实现删除数据库,我们只需要调用db.delete(表格,id)就可以了。

删除一个用户的核心代码如下:

db.delete(table, 1)

完整示例代码如下:

from mysql.db_object import Database

# 创建数据库对象
database_name = "test"
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)

# 创建数据库
db.add_database(database_name)

# 给db重新赋值
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)

# 创建表格
sql_str = "create table user(id int primary key auto_increment, name varchar(36))"
db.execute(sql_str)

# 批量添加数据
table = "user"
columns = ["name"]
values = [["张三"], ["李四"], ["王五"]]
db.add_many(table, columns, values)

# 删除张三
db.delete(table, 1)

# 查看所有数据
data = db.get_all(table)
print(data)

# 删除数据库
db.delete_database(database_name)

根据ID查询

要根据ID查询数据,我们只需要调用db.get_by_id(表格,id)就可以了。返回值是一个字典,字典的key是列名,值是列名对应的值。

根据ID查询用户的核心代码如下:

zs = db.get_by_id(table, 1)
print(zs)

完整示例代码如下:

from mysql.db_object import Database

# 创建数据库对象
database_name = "test"
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)

# 创建数据库
db.add_database(database_name)

# 给db重新赋值
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)

# 创建表格
sql_str = "create table user(id int primary key auto_increment, name varchar(36))"
db.execute(sql_str)

# 批量添加数据
table = "user"
columns = ["name"]
values = [["张三"], ["李四"], ["王五"]]
db.add_many(table, columns, values)

# 获取
zs = db.get_by_id(table, 1)
print(zs)

# 查看所有数据
data = db.get_all(table)
print(data)

# 删除数据库
db.delete_database(database_name)

根据ID列表查询

要根据ID列表查询数据,实际上也特别的简单,我们只需要调用db.get_by_ids(表格, [id列表])。返回值是一个列表,列表中的元素是字典,字典的key是列名,值是列名对应的值。

根据id列表查询用户的核心代码如下:

users = db.get_by_ids(table, [1, 2, 33])
print(users)

完整示例代码:

from mysql.db_object import Database

# 创建数据库对象
database_name = "test"
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)

# 创建数据库
db.add_database(database_name)

# 给db重新赋值
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)

# 创建表格
sql_str = "create table user(id int primary key auto_increment, name varchar(36))"
db.execute(sql_str)

# 批量添加数据
table = "user"
columns = ["name"]
values = [["张三"], ["李四"], ["王五"]]
db.add_many(table, columns, values)

# 获取
users = db.get_by_ids(table, [1, 2, 33])
print(users)

# 查看所有数据
data = db.get_all(table)
print(data)

# 删除数据库
db.delete_database(database_name)

查询并去重

这是一个非常有特色的方法,但是也经常用到。表格中有一列数据叫做name,这个name有很多条数据,但是我只想查询出不重复的名字,该怎么办呢?

其实特别的简单,我们只需要调用db.get_all_distinct(表格,列名)就行了。返回值是一个列表,列表的元素是该列名对应的不重复的值。

核心代码如下:

names = db.get_all_distinct(table, "name")
print(names)

完整示例代码:

from mysql.db_object import Database

# 创建数据库对象
database_name = "test"
db = Database(
    host="localhost",
    port=3307,
    database="",
    username="root",
    password="zhangdapeng520"
)

# 创建数据库
db.add_database(database_name)

# 给db重新赋值
db = Database(
    host="localhost",
    port=3307,
    database=database_name,
    username="root",
    password="zhangdapeng520"
)

# 创建表格
sql_str = "create table user(id int primary key auto_increment, name varchar(36))"
db.execute(sql_str)

# 批量添加数据
table = "user"
columns = ["name"]
values = [["张三"], ["李四"], ["王五"], ["张三"], ["王五"], ["王五"], ["赵六"]]
db.add_many(table, columns, values)

# 查看所有数据
data = db.get_all(table)
print(data)

# 获取名字并去重
names = db.get_all_distinct(table, "name")
print(names)

# 删除数据库
db.delete_database(database_name)

执行SQL语句

使用mysql.connect(主机地址,用户名,密码,数据库,端口号)获取MySQL连接对象。接着使用with db.cursor() as cur获取一个游标对象,通过这个游标对象,调用db.execute执行SQL语句。如果要查询,则需要跟cur.fetchxxx进行配合使用。

新增用户的核心代码如下:

cur.execute("insert into user(name) values(%s)", ("张三",))

根据ID查询用户的的核心代码如下:

cur.execute("select * from user where id=%s", (1,))
print(cur.fetchone())

根据ID修改用户的核心代码如下:

cur.execute("update user set name=%s where id=%s", ("张三三", 1))

根据ID去删除用户的核心代码如下:

cur.execute("delete from user where id=%s", (1,))

查询所有数据的核心代码如下:

cur.execute("select * from user")
print(cur.fetchall())

完整示例代码:

import mysql

# 连接数据库
db = mysql.connect(
    "localhost",
    "root",
    "zhangdapeng520",
    "zdppy_mysql_demo",
    3306,
)

# 使用游标对象执行SQL语句
with db.cursor() as cur:
    # 创建表格
    cur.execute("create table user(id int primary key auto_increment, name varchar(36))")

    # 新增数据
    cur.execute("insert into user(name) values(%s)", ("张三",))
    cur.execute("insert into user(name) values(%s)", ("李四",))
    cur.execute("insert into user(name) values(%s)", ("王五",))

    # 查询所有数据
    cur.execute("select * from user")
    print(cur.fetchall())

    # 根据id查询数据
    cur.execute("select * from user where id=%s", (1,))
    print(cur.fetchone())

    # 根据id修改数据
    cur.execute("update user set name=%s where id=%s", ("张三三", 1))
    cur.execute("select * from user")
    print(cur.fetchall())

    # 根据id删除数据
    cur.execute("delete from user where id=%s", (1,))
    cur.execute("select * from user")
    print(cur.fetchall())

    # 删除表格
    cur.execute("drop table if exists user")

使用长连接

有一个连接,这个连接每1秒中执行一次SQL语句,不希望这个连接被重复创建。

完整示例代码:

import time

import mysql

db = mysql.connect(
    "localhost",
    "root",
    "zhangdapeng520",
    "test",
    3307,
)

with db.cursor() as cur:
    cur.execute("create table user(id int primary key auto_increment, name varchar(36))")
    count = 0
    max_count = 10
    while count <= max_count:
        cur.execute("insert into user(name) values(%s)", (f"张三{count}",))
        count += 1
        time.sleep(1)

    # 查询所有数据
    cur.execute("select * from user")
    print(cur.fetchall())

    cur.execute("drop table if exists user")

文章来源:https://blog.csdn.net/qq_37703224/article/details/135346116
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。