2023.12.30 pymysql操作

2023-12-30 17:35:26

目录

1.Pymysql

1.1连接pymysql

?1.2 查询数据

?1.3增删改操作

2. Pymysql数据库练习

2.1 代码实现?

3.数据库练习2

假设之前已有用户登录的方法,但是该方法没有记录日志。现在想通过装饰器来增强原有功能


1.Pymysql

总结:
fetchall(): 获取所有查询到的内容。返回结果是嵌套的元组
fetchone(): 获取一条数据。返回结果就是一个非嵌套的元组
fetchmany(num): 返回结果是元组嵌套,底层也是有游标的。如果不传递参数num,默认读取一条数据

注意: 与文件读取类似,读取查询的数据内容的时候,底层有个游标。你读取到了什么地方,就会移动到那个地方。后续会接着从那个地方开始读
注意: execute的结果,代表的是影响的行数,并不是满足条件的数据条数

1.1连接pymysql

import pymysql

# 1 创建连接
conn = pymysql.connect(
    host='127.0.0.1',port=3306,
    user='root',password='xxxxxx',
    charset='utf8'
)
# 2 通过连接创建游标
cur = conn.cursor()

# 3 通过游标来执行sql语句

select_sql = 'select * from bi_db.daily_all_pf_orders'
result = cur.execute(select_sql)
print(result)
# 提交事务
conn.commit()

# 4 关闭游标
cur.close()

# 5 关闭连接
conn.close()

?1.2 查询数据

import pymysql

# 建立与数据库的连接
conn1 = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    db='shopnc_db'
)
conn2 = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    db='bi_db'
)
# 2.创建游标对象
c1 = conn1.cursor()
# 3.编写sql语句
sql = "select * from shopnc_db.product"
# 4.执行sql语句
c1.execute(sql)
# 5.获取结果集
result = c1.fetchall() #获取所有结果集
print(result)
# 6.关闭连接
conn1.close() # 关闭连接

?1.3增删改操作

import pymysql

try:
    # 1 获取连接
    # conn实际上是全局变量,而不是局部变量
    conn = pymysql.connect(
        host='127.0.0.1',port=3306,database='stu_test',
        user='root',password='xxxxxxx',charset='utf8'
    )
    # 2 通过连接创建游标
    cur = conn.cursor()

    # 开启事务
    conn.begin()

    # 3 执行sql语句
    #
    sql = 'alter table stu1 change class CLASS varchar(255)'
    result = cur.execute(sql)
    print(result)

    conn.commit()
except Exception as e:
    conn.rollback()
    print(e)
finally:
    # 4- 关闭游标
    cur.close()

    # 5- 关闭连接
    conn.close()

2. Pymysql数据库练习

需求:模拟用户登录网站。获取用户键盘输入的用户名和密码,先在用户数据库中检查输入信息是否匹配。如果登录成功,在MySQL的日志表中记录一条信息:某某某,什么时候登录了网站

  • 1- 用户信息表结构如下

create table day08.user_info(
?? ?id int NOT NULL AUTO_INCREMENT,
?? ?username varchar(20),
?? ?password varchar(20),
? ? PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 添加样例数据:
insert into day08.user_info(username,password) values('张三','123');?
insert into day08.user_info(username,password) values('李四','456');?

?????????2- 日志表结构如下

?create table day08.web_log(
?? ?id int NOT NULL AUTO_INCREMENT,
?? ?username varchar(20),
? ? login_time datetime,
? ? PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.1 代码实现?

"""
    需求:模拟用户登录网站。获取用户键盘输入的用户名和密码,先在用户数据库中检查输入信息是否匹配。如果登录成功,在MySQL的日志表中记录一条信息:某某某,什么时候登录了网站

    需求拆解:
    1- 获取用户键盘输入的用户名和密码
    2- 拿着用户输入的信息,去数据库查找相关内容
        select count(1) as cnt from user_info where username='' and password='';
    3- 如果查找到了对应数据:登录成功。也就是第二步的cnt=1
    4- 如果查找不到对应的数据:登录失败,也就是第二步的cnt=0
    5- 如果找到了,就在日志表中增加一条日志记录
"""

import pymysql

# 1 - 获取用户键盘输入的用户名和密码
username = input("请输入用户名:")
password = input("请输入密码:")

# 2 - 拿着用户输入的信息,去数据库查找相关内容
# 2.1- 获取数据库连接
conn = pymysql.connect(host='192.168.88.161',port=3306,database='day08',user='root',password='123456',charset='utf8')

# 2.2- 通过连接获取游标
cur = conn.cursor()

# 2.3- 执行查询SQL语句
query_user_sql = f'select count(1) as cnt from user_info where username="{username}" and password="{password}"'
# print(query_user_sql)
# 注意:execute的结果,代表的是影响的行数,并不是满足条件的数据条数
result = cur.execute(query_user_sql)

# 通过游标获取具体的数据条数
user_num_tup = cur.fetchall()
user_num = user_num_tup[0][0]



if user_num==0:
    # 3 - 如果查找不到对应的数据:登录失败,也就是第二步的cnt = 0
    print("登录失败")
else:
    # 4 - 如果查找到了对应数据:登录成功。也就是第二步的cnt = 1
    # 5 - 如果找到了,就在日志表中增加一条日志记录
    insert_sql = f"insert into web_log (username,login_time) values ('{username}',current_time())"

    cur.execute(insert_sql)

    # 手动提交事务
    conn.commit()

# 2.4- 关闭游标
cur.close()

# 2.5- 关闭连接
conn.close()

3.数据库练习2

假设之前已有用户登录的方法,但是该方法没有记录日志。现在想通过装饰器来增强原有功能

?原有登录方法如下:

def user_login(username,password):
	sql = f'select count(1) as cnt from user_info where username="{username}" and password="{password}"'
	result = cur.execute(sql)
	
	user_num_tup = cur.fetchall()
	user_num = user_num_tup[0][0]
	
	return user_num==1

增强后的代码:

import pymysql

# 1 - 获取用户键盘输入的用户名和密码
username = input("请输入用户名:")
password = input("请输入密码:")

# 2 - 拿着用户输入的信息,去数据库查找相关内容
# 2.1- 获取数据库连接
conn = pymysql.connect(host='192.168.88.161',port=3306,database='day08',user='root',password='123456',charset='utf8')

# 2.2- 通过连接获取游标
cur = conn.cursor()

# 定义日志记录的装饰器
def log(func):
    def wrapper(username,password):
        result = func(username,password)

        if not result:
            # 3 - 如果查找不到对应的数据:登录失败,也就是第二步的cnt = 0
            print("登录失败")
        else:
            # 4 - 如果查找到了对应数据:登录成功。也就是第二步的cnt = 1
            # 5 - 如果找到了,就在日志表中增加一条日志记录
            insert_sql = f"insert into web_log (username,login_time) values ('{username}',current_time())"

            cur.execute(insert_sql)

            # 手动提交事务
            conn.commit()

        return result
    return wrapper

@log
def user_login(username,password):
    """
        用来判断用户是否登录成功
    :param username: 用户名
    :param password: 密码
    :return: True:登录成功;False:登录失败
    """
    # 2.3- 执行查询SQL语句
    sql = f'select count(1) as cnt from user_info where username="{username}" and password="{password}"'
    # print(sql)
    # 注意:execute的结果,代表的是影响的行数,并不是满足条件的数据条数
    result = cur.execute(sql)

    # 通过游标获取具体的数据条数
    user_num_tup = cur.fetchall()
    user_num = user_num_tup[0][0]

    return user_num==1


log_result = user_login(username,password)
print("登录结果:",log_result)

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