python操作数据库

python操作mysql数据库

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('暂时没有当前功能编号')

 

posted @ 2021-11-20 15:08  一叶松  阅读(70)  评论(0编辑  收藏  举报