python3,pymysql,操作MySql数据库(可直接使用),有的时候执行sql后数据库却没有数据、sql注入漏洞、删除的风险等等。

不废话,线上代码

#__author__ = 'chubby_superman'  胖超人
#_*_coding=utf-8 _*
import pymysql

class db_ope():
    def __init__(self,host,user,password,port,lib):
        self.host=host
        self.user=user
        self.password=password
        self.lib=lib
        self.port=port
    # 连接数据库
    def get_db(self):
        db = pymysql.connect(self.host,self.user,self.password,self.lib,self.port,charset='utf8')
        return db
    #查询方法
    def select_func(self,sql):
        database=self.get_db()
        cursor=database.cursor()
        try:
            cursor.execute(sql)
            database.commit()
            data = cursor.fetchone()
        except Exception as e:
            print(e)
            database.rollback()
        print("查询结果\n",data)
        database.close()
        return data
    #插入方法
    def insertinto_func(self,sql):
        database=self.get_db()
        cursor=database.cursor()
        try:
            cursor.execute(sql)
            database.commit()
            print("保存成功,影响%s行"%cursor.rowcount)
        except Exception as e:
            print(e)
            print("保存失败")
            database.rollback()
        database.close()
    def delete_func(self,sql):
        database=self.get_db()
        cursor=database.cursor()
        try:
            cursor.execute(sql)
            database.commit()
            print("删除成功,影响%s行"%cursor.rowcount)
        except Exception as e:
            print(e)
            database.rollback()
        database.close()
    def updata_func(self,sql):
        database=self.get_db()
        cursor=database.cursor()
        try:
            cursor.execute(sql)
            database.commit()
            print("更新成功,影响%s行"%cursor.rowcount)
        except Exception as e:
            print(e)
            database.rollback()
        database.close()

if __name__ == "__main__":
    host = "你家的mysql地址"
    user = "test"
    password = "test1234"
    port = 3306
    lib = "localtest"
    data_base=db_ope(host,user,password,port,lib)
    data_base.select_func("select * from shelf_goods WHERE id=11616")
    '''
    pymysql执行cursor.execute(sql)时可能会存在注入漏洞
    不推荐使用: sql='select * from userinfo where username="%s" and password="%s" ' %(user,pwd,)
    推荐使用  : sql = 'select * from userinfo where username=%s and password=%s',[user,pwd]
    本文可以改成这样:select_func('select * from userinfo where username=%s and password=%s',[user,pwd])
    '''
    data_base.insertinto_func("INSERT INTO shelf_activity_press(goods_id,goods_name,goods_image,period)"
                                                    " VALUES(11616,'test','a',10000)")
    '''
    1、需要注意,所执行的插入语句依然有可能出问题,例如报出:Warning: (1364, "Field 'period' doesn't have a default value")
    这是因为,数据表中,相对应的字段没有默认值,插入时需要设定,否则就会报错.另外,需要仔细对照字段的数据类型;
    2、有一个小坑,database=self.get_db(),因为连接数据库方法,每执行一次,就会建立并返回一个数据库连接,所以,在执行sql的时候
    应该是这样:连接数据库,获取游标,游标执行sql,提交。而不是这样:连接数据库,获取游标,游标执行sql,连接数据库,提交。
    '''

    data_base.updata_func("update shelf_activity_press set goods_name='tester' where period=10000")
    
    data_base.delete_func("DELETE FROM shelf_activity_press WHERE period=10000")
    '''
    1、sql中truncate,delete以及drop的区别,有兴趣的童鞋可以百度下,这里只用delete,从不建议数据库工程师以外的人
    使用drop和truncate。
    2、sql中,使用删除时一定要加上where子句哦,否则很容易“被跑路”,也就是辞退,起码也要通报批评了。
    '''

总结
1、
连接数据库方法,每执行一次,就会建立并返回一个数据库连接,有的时候执行sql后数据库却没有数据
应该是这样:连接数据库,获取游标,游标执行sql,提交。
而不是这样:连接数据库,获取游标,游标执行sql,连接数据库,提交。
所以,代码中,调用数据库连接get_db()后赋值给database,这样后续操作才能保证在同一链接上进行
2、
pymysql执行cursor.execute(sql)时可能会存在注入漏洞
不推荐使用: sql='select * from userinfo where username="%s" and password="%s" ' %(user,pwd,)
推荐使用 : sql = 'select * from userinfo where username=%s and password=%s',[user,pwd]
本文可以改成这样:select_func('select * from userinfo where username=%s and password=%s',[user,pwd])
3、
sql中truncate,delete以及drop的区别,有兴趣的童鞋可以百度下,这里只用delete,从不建议数据库工程师以外的人使用drop和truncate。
感兴趣的可以看看三者异同:https://www.cnblogs.com/tiger95/p/7466096.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章