Mysql实战中的一些小tips

1. 问题:使用select进行查表,出现连接事务一直连接,导致锁表,没办法对表格进行修改操作。

        解决办法:

# 在建立conn连接时,设置commit如下:

self.dbconn = MySQLdb.connect(host=sql_conf.MYSQL_HOST, port=sql_conf.MYSQL_PORT, user=sql_conf.MYSQL_USER, passwd=sql_conf.MYSQL_PASS, db=sql_conf.MYSQL_DB, connect_timeout=10)

self.dbconn.autocommit(True)

2. 从数据库读取json.dumps的字段后,直接使用json.loads()转换,出现错误:Expecting ',' delimiter: line 1 column 7 (char 6)

错误原因是,字符串格式不规范,如双引号里面含有双引号:

'["1.0"大尺寸CMOS 约2020万有效像素", "F1.8-2.8大光圈,24mm广角+4.2倍光学变焦镜头,5cm微距", "Wi-Fi影像分享,NFC近场通信,更方便的遥控拍摄", "汇集多种模式,丰富你的拍摄构思", "机身搭载取景器,更专业与更舒适的拍摄体验”]'

解决方法:

在入库之前,使用pymysql.escape_string(value)对dumps后的字符串先进行下转换,变成数据库格式字符串,再入库即可。这个操作,会对双引号内部的双引号进行转义。

3. 错误:Incorrect string value: '\xE4\xB8\xAD\xE5\x9B\xBD' for column 'word' at row 1

排查步骤:

  1. 排查数据库编码,确认是否是 utf-8
  2. 如果还有问题,继续确认表格编码是否是utf-8
  3. 如果还有问题,继续确认表格中字段编码是否是utf-8

本次遇到的问题,是因为字段的编码是char,调整为utf-8格式即正常。

4. 需求场景为:有表格a,表格b,和表格c,

对于c中满足a.user_id=c.user_id的记录,更新a中对应记录的某些字段:

UPDATE c
SET 
    (c.USER_NAME, c.ID_CARD, c.MOBILE) = (
        SELECT a.USER_NAME, a.CARD_NO, a.MOBILE
        FROM a
        WHERE a.USER_ID = c.USER_ID
    )
WHERE EXISTS (
    SELECT 1
    FROM a
    WHERE c.USER_ID = a.USER_ID
);

对于上面的查询需求,如果where条件过滤后得到的条数不只1条,导致更新出错时,如需求上可以过滤掉多数的轻轻,可以做如下处理:

UPDATE c
SET 
    (c.USER_NAME, c.ID_CARD, c.MOBILE) = (
        SELECT uni_a.USER_NAME, uni_a.CARD_NO, uni_a.MOBILE
        FROM (
            SELECT a.USER_NAME,
                   a.CARD_NO, 
                   a.MOBILE, 
                   ROW_NUMBER() OVER (PARTITION BY a.USER_ID) AS rn
            FROM a
        ) uni_a
        WHERE a.USER_ID = c.USER_ID
        AND uni_a.rn = 1
    )
WHERE EXISTS (
    SELECT 1
    FROM a
    WHERE c.USER_ID = a.USER_ID
);

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值