python mysql

使用aiomysql异步操作mysql
为什么PyMySQL获取一条数据会让内存爆炸
解决办法在创建数据库连接的时候指定游标类型。pymysql.connect有一个参数叫做cursorclass,把它的值设定为pymysql.SSDictCursor并使用for循环即可解决问题。

import pymysql


connection = pymysql.connect(host='localhost',
                             user='user',
                             password='passwd',
                             db='db',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.SSDictCursor)
                             
with connection.cursor() as cursor:
    db = 'select * from users where age > 10'
    cursor.execute(db)
    for row in cursor:
        print('对 cursor 直接进行迭代,每循环一次,从数据库读取一条数据。不会提前把所有数据读取到内存中。')
        print(row['name'])

1. pymysql

  1. connection对象支持的方法有:
cursor()   #使用该链接并返回游标
commit()   #提交当前世务
rollback() #回滚当前事务
close()    #关闭连接
  1. 数据库游标对象consor,用于执行查询结果和获取结果。其支持的方法有:
execute(op[,args])  #执行一个数据库查询和命令
fetchone()          #取得结果集的下一行
fetchmany(size)     #取得结果集的下size行
fatchall()          #取得结果集剩下的所有行
rowcount            #最近一次execute返回数据的行数或影响行数
close()             #关闭游标对象
  1. executemany在insert into 语句的values中,使用%s即可. 程序会自动转换,使用其它会报错
    具体数值,list 或 tuple均可.
  2. SSDictCursor, 和 SSCursor 无缓冲游标,主要用于返回大量数据的查询. 内存占用仍然会比较大. 实测比50万数据分页并不快,内存占用更大.
    使用 SSCursor (流式游标) 解决 Python 使用 pymysql 查询大量数据导致内存使用过高的问题
    因为 SSCursor 是没有缓存的游标,结果集只要没取完,这个 conn 是不能再处理别的 sql,包括另外生成一个 cursor 也不行的。如果需要干别的,请另外再生成一个连接对象。
    每次读取后处理数据要快,不能超过 60 s,否则 mysql 将会断开这次连接,也可以登录mysql,执行 SET NET_WRITE_TIMEOUT = xx 来增加超时间隔。
    使用迭代器而不用 fetchall ,即省内存又能很快拿到数据。
  3. 处理转义字符escape_string
content=pymysql.escape_string(content)
  1. python向mysql插入特殊字符
name = "\\"; 
name2 = "\""
注意: cursor.execute()可以接受一个参数,也可以接受两个参数:
(1) cursor.execute("insert into resource(cid,name) values(%s, %s)" , (12,name) );
    这种格式是接受两个参数,MySQLdb会自动替你对字符串进行转义和加引号,不必再自己进行转义,执行完     此语句之后,resource表中多了一条记录: 12   \
(2) cursor.execute("insert into resource(cid,name) values(%s, %s)" % (12,name) );
    这种格式是利用python的字符串格式化自己生成一个query,也就是传给execute一个参数,此时必须自己对     字符串转义和增加引号,即上边的语句是错误的,应该修改为:
    name = MySQLdb.escape_string(name);
    cursor.execute("insert into resource(cid,name) values(%s, '%s')" % (12,name) );
    这样插入的记录才和(1)一样:12   \
  1. on duplicate key update 只能用在execute. 后面必须写更新字段
    更新去掉shardkey字段
    on duplicate key这个的功能就是插入主键冲突的时候,做更新操作,后面不写主键
    原始sql
insert into info(tid, docid, weight, aithumbs, version) values("63","GQs","26","1",43) on duplicate key update docid="GQs", weight="26", aithumbs="1", version=43
       content=pymysql.escape_string(content)
       #select docid,content,ctype,is_valid,sourceid from qb_index_data

 sql = "insert into qb_index_data (docid,content,ctype,is_valid,sourceid,createtime) \
       values ('%s','%s','%s','%s','%s',NOW()) ON DUPLICATE KEY UPDATE " \
       "content='%s',ctype='%s',is_valid='%s',sourceid='%s' " \
       % (docid,content,ctype,is_valid,sourceid,content,ctype,is_valid,sourceid)cursor.execute("INSERT INTO input_1 (a,b,c,d) VALUES (%s,%s,%s,%s) 
ON DUPLICATE KEY UPDATE  a=%s,b=%s,c=%s", 
(item['a'],item['b'],item['c'],item['d'],item['a'],item['b'],item['c']))
   	或

sql_select_Query = """
INSERT `{0}`  (age, city, gender, UniqueId)
VALUES (%s, %s, %s, %s)
ON DUPLICATE KEY UPDATE
 age=VALUES(age), city=VALUES(city), gender=VALUES(gender)
""".format(table_name)

cursor.execute(sql_select_Query, ('877', '2', '1', '2898989'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值