python学习笔记四:pymysql操作mysql

文章目录

  • 建立连接
    • 检查连接状况
  • 批量插入
  • 查询
  • SQL结果写入文件
    • 设置游标类型
  • SQL注入


建立连接

INSERT、UPDATE、DELETE 等修改数据的语句需手动执行commit()完成对数据修改的提交


import pymysql 

db = pymysql.connect(host = "localhost", 
                     port = 3306,
                     user = "root", 
                     password = "xxx", 
                     db = "test", 
                     charset='utf8')

#获取光标
cursor = db.cursor()

effect_row = cursor.execute('''
CREATE TABLE student(
    id varchar(10) NOT NULL,
    name varchar(10) NOT NULL,
    age int(10) NOT NULL DEFAULT 0,
    score int(10) NOT NULL DEFAULT 0,
    PRIMARY KEY(id)
)
''')

effect_row = cursor.execute('''INSERT INTO student VALUES 
                            ('1', 'lzj', 22, 99),
                            ('2', 'zjl', 23, 98),
                            ('3', 'wrh', 21, 80)''')
db.commit()

db.close()

检查连接状况

db.ping()函数会校验连接的可用性,如果连接不可用将会产生异常
可以捕获异常进行处理(重连之类的)

批量插入

执行多条sql语句使用executemany, 如果插入数量较少, 使用execute没有什么大关系, 但是数量较多, executemany的效率要高很多倍


sql = "insert into student (id, name, age, score) values (%s, %s, %s, %s)"
values=[("5", "zhangsan", 25, 89), ("6","lisi", 23, 60)]

effect_row = cursor.executemany(sql, values)

  1. 构造SQL时, 不管字段为什么类型,占位符统一使用%s,且不能加上引号
  2. 添加的数据的格式必须是list[tuple(),tuple(),tuple()]或者tuple(tuple(),tuple(),tuple())

查询

sql = "SELECT * from test.student"
effect_row = cursor.execute(sql)

result_one = cursor.fetchone()
print(result_one)

cursor.scroll(-1, mode='relative')
result_two = cursor.fetchmany(2)    
print(result_two)
  • 游标控制
    cursor.scroll(-1, mode=‘relative’) # 相对当前位置移动
    cursor.scroll(2, mode=‘absolute’) # 相对绝对位置移动,即首行
    正数向下, 负数向上移动

SQL结果写入文件

设置游标类型

游标类型决定了查询默认返回结果的数据结构, 默认为元组, 可以自定义设置返回类型

  1. ursor: 默认,元组类型
  2. DictCursor: 字典类型
  3. DictCursorMixin: 支持自定义的游标类型,需先自定义才可使用
  4. SSCursor: 无缓冲元组类型
  5. SSDictCursor: 无缓冲字典类型
  • 连接数据库时指定:
db = pydb.connect(host = "localhost", 
                  port = 3306,
                  user = "root", 
                  password = "zijianlv", 
                  db = "test", 
                  charset='utf8',
                  cursorclass=pymysql.cursors.DictCursor)
  • 创建游标时指定
cursor = db.cursor(cursor=pymysql.cursors.DictCursor)

返回结果是元组:
((‘1’, ‘lzj’, 22, 99), (‘2’, ‘zjl’, 23, 98), (‘3’, ‘wrh’, 21, 80), (‘5’, ‘zhangsan’, 25, 89), (‘6’, ‘lisi’, 23, 60))
使用迭代器访问其中元素写入文件:

result_all = cursor.fetchall()
with open("./test.txt", "wt") as f :
    it = iter(result_all)
    for x in it :
        print(x[0], x[1], x[2], x[3], file = f)

SQL注入

SQL语句是字符串拼接生成的时,这也一定会存在SQL注入安全问题
解决办法:

  1. 使用占位符:
    例如:
SQL = "select name,password from tb1 where name = %s and password = %s"
info=('min" -- ', 1234)
cursor.execute(SQL,info)

而不是

SQL= SQL %('min" -- ', 1236)

execute()函数具有接受SQL语句参数变量的参数位置, 正确使用就可以对传入的值进行转义, 从而避免SQL注入攻击, 即不要直接使用%将参数拼接到SQL上然后直接这样:execute(SQL)使用

你可能感兴趣的:(Python,python)