Python3 - pymysql模块(第三方)

目录

零、pymysql

一、简单操作数据库(建立连接、获取游标、关闭连接)

二、 数据库的增、删、改操作(conn.commit()) 

三、数据库的查找(fetchone,fetchmany,fetchall)

四、获取插入数据表的最后一条数据的自增id(cursor.lastrowid)

五、pymysql对sql注入的自动预防

5-1 基于防注入的SQL语句写法 - 字典


 

零、pymysql

PyMySQL是一个基于python编写的mysql驱动程序,可以让python语言操作mysql数据库。

pymysql 官方文档

安装:pip3 install pymysql

一、简单操作数据库(建立连接、获取游标、关闭连接)

import pymysql

user=input('用户名: ').strip()
pwd=input('密码: ').strip()

# 和数据库建立链接
conn=pymysql.connect(
    host='localhost',
    user='root',
    password='123',
    database='test',charset='utf8'
)

# 获取接受sql语句的对象(游标),默认用元组返回结果
cursor=conn.cursor() 
#同上,但执行完毕返回的结果集以字典显示
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)


# 执行sql语句,返回终端的是执行成功后,受影响的行数
sql_rows='select * from userinfo where name="%s" and password="%s"' %(user,pwd)
# 注意%s需要加引号
print(sql_rows)

select_count=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
print(select_count)

# 关闭数据库连接
cursor.close()
conn.close()

if select_count:
    print('登录成功')
else:
    print('登录失败')

 

二、 数据库的增、删、改操作(conn.commit()) 

import pymysql

# 和数据库建立连接链接
conn=pymysql.connect(host='localhost',user='root',password='123',database='test')
# 获取游标
cursor=conn.cursor()

# 执行修改语句的三种方法

## part1 语句中直接写入修改数据
# sql='insert into userinfo(name,password) values("root","123456");'
# res=cursor.execute(sql) # 执行sql语句,返回sql影响成功的行数
# print(res)

## part2 语句外,后续操作进行对于数据写入
# sql='insert into userinfo(name,password) values(%s,%s);'
# res=cursor.execute(sql,("root","123456")) # 执行sql语句,返回sql影响成功的行数
# print(res)

## part3 语句外,写入多个修改数据
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) # 执行sql语句,返回sql影响成功的行数
print(res)

conn.commit() 
# 提交修改操作,执行commit后才能成功修改

cursor.close()
conn.close()

三、数据库的查找(fetchone,fetchmany,fetchall

import pymysql

# 获取连接对象
conn=pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db42',
    charset='utf8'
)
# 获取接受sql语句的对象(dictcursor 是以字典的形式返回)
cursor=conn.cursor(pymysql.cursors.DictCursor)

# 执行sql语句,返回的是执行成功受影响的行数
rows=cursor.execute('select * from class;')
print(rows)

# fetchone()一次只查取一个
print(cursor.fetchone())
print(cursor.fetchone())

# fetchmany(num)一次只查取num个
print(cursor.fetchmany(2))

# fetchall()一次取完存在列表中
print(cursor.fetchall())
# 第二次取全部则取出空列表
print(cursor.fetchall())


print(cursor.fetchall())
# 重置指针位置absolute是最开始的位置,3代表往后移动三条,取到第四条输出
cursor.scroll(3,'absolute')
print(cursor.fetchone())

print(cursor.fetchone()) #第一条输出
print(cursor.fetchone()) # 第二条输出
# 相对于当前位置往后走一条
cursor.scroll(1,'relative') #当前第二条,往后走一条
print(cursor.fetchone())# 输出第三条

cursor.close()
conn.close()

四、获取插入数据表的最后一条数据的自增id(cursor.lastrowid)

import pymysql

conn=pymysql.connect(host='localhost',user='root',password='123',database='test')
cursor=conn.cursor()

sql='insert into userinfo(name,password) values("xxx","123");'
rows=cursor.execute(sql)

# cursor.lastrowid
print(cursor.lastrowid) #在插入语句后查看

conn.commit()

cursor.close()
conn.close()

五、pymysql对sql注入的自动预防

# 原来是我们对sql进行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
# print(sql)
# res=cursor.execute(sql)

# 改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from userinfo where name=%s and password=%s" 
''' !!!注意%s需要去掉引号,因为pymysql会自动为我们加上 '''
res=cursor.execute(sql,[user,pwd]) 
# pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

5-1 基于防注入的SQL语句写法 - 字典

def sql_storage(self, data_dic):
    # 确保数据字典内没有空字段,存在执行即报错
    for k, v in data_dic.items():
        if not v:
            data_dic[k] = 0
    # 存在更新,未存在添加
    select_sql = 'select id from exchange_information where name=%s'

    # 返回执行成功受影响的行数
    select_rows = self.cusor.execute(select_sql, (data_dic['name'],))
    if not select_rows:
        sql = '''
                    insert into exchange_information
                    (name,slug,logo_url,website,twitter_url,blog_url,chat_url,fee_url,visible) 
                    values(%(name)s,%(slug)s,%(logo_url)s,%(website)s,%(twitter_url)s,%(blog_url)s,%(chat_url)s,%(fee_url)s,%(visible)s);
                     '''
    else:
        data_dic['id'] = self.cusor.fetchone()
        # 书写 SQL 语句时,关键词前不可存在 ‘,’
        sql = '''
                     update exchange_information set 
                         name=%(name)s,
                         slug=%(slug)s,
                         logo_url=%(logo_url)s,
                         website=%(website)s,
                         twitter_url=%(twitter_url)s,
                         blog_url=%(blog_url)s,
                         chat_url=%(chat_url)s,
                         fee_url=%(fee_url)s
                     where id=%(id)s
                    '''
    self.cusor.execute(sql, data_dic)
    self.connect.commit()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值