Python代码操作MySQL编程实例

PHP编程技术 网络投稿 2021-12-17 19:40 669 0

Python代码操作MySQL

python	胶水语言、调包侠(贬义词>>>褒义词)
"""
python这门语言本身并不牛逼 牛逼的是支持该语言的各种功能强大的模块、软件
"""
# 后期在使用python编程的时候 很多看似比较复杂功能可能都已经有相应的模块
 
模块名字 pymysql
 
下载模块
	1.命令行
    	pip3 install pymysql
		pip3 install pymysql -i 源地址
    2.借助于pycharm
    3.python解释器配置文件


模块基本使用

import pymysql
 
# 创建链接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db1',
    charset='utf8',
    autocommit=True  # 涉及到增删改 自动二次确认
)
 
# 生成一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典
# 定义SQL语句
sql = 'select * from userinfo'
# 执行SQL语句
res = cursor.fetchall()
# 避免光标到最末端,导致读取不到数据
cursor.scroll(0,'absolute')  # 相对数据开头位置移动,从第一个数据重新开始
# cursor.scroll(1,'relative')    # 相对当前位置移动,从当前位置跳过一个数据
print(res)
 
 
# 注:
    1、execute返回值:是执行SQL语句之后收到影响的行数
 
    2、获取返回结果
        fetchall():获取所有的结果             # 结果:列表套字典
        fetchone():获取结果集的第一个结果      # 结果:数据字典
        fetchmany():括号内可以指定获取几个结果 # 结果:列表套字典
        
    3、fetchall():存在光标的概念,读取一遍之后光标在最末端,第二遍读取是没有数据的
    
    4、scroll():可以解决光标读取的问题
        cursor.scroll(1,'relative')    # 相对当前位置移动,从当前位置跳过一个数据
        cursor.scroll(0,'absolute')    # 相对数据开头位置移动,从第一个数据重新开始	


SQL注入问题

SQL注入问题的产生:
    就是通过一些特殊符号的组合 达到某些特定的效果从而避免常规的逻辑
 
代码:
 
import pymysql
# 创建链接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db_5',
    charset='utf8',
    autocommit=True  # 涉及到增删改 自动二次确认
)
# 生成一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典
# 获取用户名和密码
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 构造SQL语句
# sql = "select * from userinfo where name='%s' and password='%s'"%(username,password)
# 针对核心数据 不要自己拼接 交由execute方法帮你筛选再拼接
sql = "select * from userinfo where name=%s and password=%s"  # 放到这里帮你拼接
print(sql)
# 执行SQL语句
cursor.execute(sql,(username,password))
res = cursor.fetchall()
if res:
    print(res)
    print('登录成功')
else:
    print('用户名或密码错误')
    
"""
登录功能
    1.获取用户名和密码
    2.基于用户名和密码直接精准查找
"""
"""
问题1 
    用户名正确 不需要密码也能登录
问题2
    用户名和密码都不需要也能登录
SQL注入问题的产生
    就是通过一些特殊符号的组合 达到某些特定的效果从而避免常规的逻辑
SQL注入问题如何解决
    execute方法自动帮你解决
    比如:
        # 针对核心数据 不要自己拼接 交由execute方法帮你筛选再拼接
        sql = "select * from userinfo where name=%s and password=%s"  # 放到这里帮你拼接
        print(sql)
        # 执行SQL语句
        cursor.execute(sql,(username,password))  # 放到这里帮你拼接 ,一次性插入一个数据
        cursor.executemany   # 一次性插入多个
"""

功能补充

#  加上这个选项:autocommit=True ,增删改会自动确认后修改数据,不然会二次确认才会修改数据
 
import pymysql
 
# 创建链接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db_5',
    charset='utf8',
    autocommit=True  # 涉及到增删改 自动二次确认
)
# 生成一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典
sql1 = 'select * from userinfo'
sql2 = 'insert into userinfo(name,password) values(%s,%s)'
sql3 = 'update userinfo set name="jasonNB" where id=1'
sql4 = 'delete from userinfo where id=2'
 
cursor.executemany(sql2,[('jason111',123),('jason222',321),('jason333',222)])  # 一次插入多条数据
 
# 主动关闭链接 释放资源
conn.close()
 
测试:
# 1.查询语句可以正常执行并获取结果
# cursor.execute(sql1)
 
# 2.插入语句能够执行 但是并没有影响表数据
# cursor.execute(sql2,('jackson',666))
 
# 3.更新语句能够执行 但是并没有影响表数据
# res = cursor.execute(sql3)
# print(res)
 
# 4.删除语句能够执行 但是并没有影响表数据
# res = cursor.execute(sql4)
# print(res)
 
'''针对增删改操作 需要二次确认才可生效'''
# cursor.execute(sql2,('jackson',666))
# conn.commit()
# cursor.execute(sql3)
# conn.commit()
# cursor.execute(sql4)
# conn.commit()
 
结论:加上这个选项:autocommit=True ,增删改会自动确认后修改数据,不然会二次确认才会修改数据

注册登录功能

def register(cursor):
    # 获取用户名和密码
    username = input('请输入注册用户名:').strip()
    password = input('请输入密码:').strip()
    # 验证用户名是否已存在
    sql = 'select * from userinfo where name=%s'
    # 执行SQL语句
    cursor.execute(sql,(username,))
    # 获取返回结果
    res = cursor.fetchall()
    # 判断用户是否存在
    if not res:
        sql1 = 'insert into userinfo(name,password) values(%s,%s)'
        cursor.execute(sql1,(username,password))
        print('用户:%s注册成功'%username)
    else:
        print('用户名已存在')
 
def login(cursor):
    # 获取用户名和密码
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    # 先获取是否存在用户名相关数据
    sql = 'select * from userinfo where name=%s'
    # 看看有没有这个用户
    cursor.execute(sql,(username,))
    # 获取返回结果
    res = cursor.fetchall()
    # 判断用户是否存在
    if res:
        # 校验密码
        real_dict = res[0]
        if password == str(real_dict.get('password')):
            print('用户:%s登录成功'%username)
        else:
            print('密码错误')
    else:
        print('用户不存在')
 
def get_conn():
    import pymysql
 
    # 创建链接
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='db1',
        charset='utf8',
        autocommit=True
    )
 
    # 生成一个游标对象
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典
    return cursor
 
func_dic = {
    '1':register,
    '2':login
}
 
while True:
    print('''
    1.注册功能
    2.登录功能
    ''')
    cursor = get_conn()
    choice = input('输入指定指令:').strip()
    if choice in func_dic:
        func_name = func_dic.get(choice)
        func_name(cursor)
    else:
        print('指令错误')