python操作数据库
python 胶水语言、调包侠(贬义词>>>褒义词)
"""
python这门语言本身并不牛逼 牛逼的是支持该语言的各种功能强大的模块、软件
"""
# 后期在使用python编程的时候 很多看似比较复杂功能可能都已经有相应的模块
# 1.需要用到pymysql模块
在pycharm上安装模块
下载模块
1.命令行
pip3 install pymysql
pip3 install pymysql -i 源地址()
2.借助于pycharm
3.python解释器配置文件(setings)
模块基本使用
import pymysql
# 建立连接
conn = pymysql.connect(
HOST="127.0.0.1",
port=3306,
user="root",
password="123456",
database="db06",
charset="utf8",
autocommit=True # 由于查看与修改表格数据权限不一样,修改表格需要二次确认,这个参数会自动二次确认(如果不加,只能查看,不能对表格进行修改操作)
)
# 生成一个浮标对象(相当于一个挂起状态)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 括号里的参数的作用让数据自动组织成字典
# 书写sql语句
sql = "select * fom userinfo" # userinfo表名
# 执行sql语句
res = cursor.execute(sql) # res返回数据是可以操作的数据个数
# 获取数据
res1 = cursor.fetchall() # 返回值是列表套字典格式(sql语句执行的结果)
# res1 = cursor.fetchone() 获取第一个数据
print(res)
SQL注入问题
# 什么是sql注入问题
sql语句在对密码文件进行拼接,登录时可以通过一些特殊字符(注释--)实现无密码登录
import pymysql
# 创建链接
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='db_5',
charset='utf8'
)
# 生成一个游标对象
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方法自动帮你解决
"""
功能补充
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) # 参数的作用让数据自动组织成字典
# 书写sql语句(由于需要的权限不同,在执行查看数据库是可以正常操作,但修改时无法生效,需要二次确认)
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'
# 1.查询语句可以正常执行并获取结果
# cursor.execute(sql1)
# 2.插入语句能够执行 但是并没有影响表数据
# cursor.execute(sql2,('jackson',666))
# 3.更新语句能够执行 但是并没有影响表数据
# res = cursor.execute(sql3)
# print(res)
# 4.删除语句能够执行 但是并没有影响表数据
# res = cursor.execute(sql4)
# print(res)
'''针对增删改操作 需要二次确认才可生效'''
但由于手动确认太过麻烦,autocommit(自动确定)
# cursor.execute(sql2,('jackson',666))
# conn.commit()
# cursor.execute(sql3)
# conn.commit()
# cursor.execute(sql4)
# conn.commit()
# 可以一次执行多条sql语句
cursor.executemany(sql2,[('jason111',123),('jason222',321),('jason333',222)])
# 主动关闭链接 释放资源
# conn.close()
注册登录功能
def register(cursor):
# 获取用户名和密码
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 验证用户名是否已存在
sql = 'select * from userinfo where name=%s'
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('username>>>:').strip()
password = input('password>>>:').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('登录成功')
else:
print('密码错误')
else:
print('用户名不存在')
def get_conn():
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) # 让数据自动组织成字典
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('暂时没有当前功能编号')