吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1439|回复: 10
收起左侧

[求助] Python怎么优雅实现更新MySQL数据库不固定的字段数量

  [复制链接]
头像被屏蔽
孙云 发表于 2022-8-30 23:50
提示: 作者被禁止或删除 内容自动屏蔽

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Loker 发表于 2022-8-31 00:11
本帖最后由 Loker 于 2022-8-31 00:13 编辑

思路
一个class,构造函数的参数是表名,构造函数内部会初始化数据库的连接
内部实现update方法,传入可变参数,
一个参数时传入列表,列表里面是map或者其他,保存一个或多个要修改的属性和值。遍历列表更新数据库。
两个参数时,第一个字符串类型,为表字段;第二个参数类型任意,为字段值。直接更新单条数据。
wuxin9749 发表于 2022-8-31 09:11
iawyxkdn8 发表于 2022-8-31 09:27
lz6905 发表于 2022-8-31 09:31
其实只要几个关键语句就可以实现所有操作,1.连接,2执行SQL(无返回值--设置,新建等,有返回值查询),2关闭连接。
这是我写python里面的一些关键语句:
1、连接
[Python] 纯文本查看 复制代码
    def connect(self):
        self.conn = pymysql.connect(host=self.host, port=self.port, user=self.user, passwd=self.passwd, db=self.db,
                                    charset=self.charset, local_infile=self.local_infile)
        self.cur = self.conn.cursor()
        if self.cur:
            p_t('mysql连接成功')
        else:
            p_t('mysql连接失败')

2、执行SQL
1)无返回
[Python] 纯文本查看 复制代码
    def cmd(self, commit=0, sql='', datebase=''):
        if sql == '':
            sql = self.sql
        if datebase != '':
            self.cur.execute('use %s;' % datebase)
        # 设置编码格式
        self.cur.execute('SET NAMES utf8mb4;')
        self.cur.execute('SET FOREIGN_KEY_CHECKS = 0;')
        # print(sql)
        self.cur.execute(sql)
        # p_t('执行 SQL:')
        # p_t(sql, '黄', 1)
        self.cur.execute('SET FOREIGN_KEY_CHECKS = 1;')
        # print(self.cur.fetchone())
        # print('--------------------------')
        # print(self.cur.fetchall())
        if commit == 1:
            self.conn.commit()
            # p_t('mysql提交:commit', '青', 1)

    # 私有方执行自定义字典方法
    def __cmd(self, dd, cmd=0):
        sst = time.time()
        self.cmd(cmd, dd['txt'])
        p_t(dd['mean'] + ' | 运行时间长: %s 秒' % round((time.time() - sst), 2))

    def execute(self, sql, commit: int = 0, msg: int = 1):
        fh = self.cur.execute(sql)
        if msg == 1:
            print('影响行数: %s' % fh)
        if commit == 1:
            self.conn.commit()


2)有返回
[Python] 纯文本查看 复制代码
    def fetchone(self, sql):
        self.cur.execute(sql)
        return self.cur.fetchone()

    def fetchall(self, sql):

        self.cur.execute(sql)
        col = self.cur.description
        fh = self.cur.fetchall()

        return col, fh


3、关闭
[Python] 纯文本查看 复制代码
    def close(self):
        self.cur.close()
        self.conn.close()
        p_t('关闭mysql连接')
外酥内嫩 发表于 2022-8-31 09:43
感觉实现起来有可行性
kw2022 发表于 2022-8-31 10:28
写个类,里面方法判断更新有哪些字段?再拼接?是有点繁琐,想不到其他更好的办法了
yhp869 发表于 2022-8-31 10:56
我用的是 *args, **kwargs , 表名放*args里,更新的key和value放**kwargs里,里面拼接sql语句
kyle233 发表于 2022-8-31 11:02
试试ORM?
hanzj06 发表于 2022-8-31 11:21
本帖最后由 hanzj06 于 2022-8-31 11:22 编辑

字段和值可以打包成字典传到函数
[Python] 纯文本查看 复制代码
    def insertData(self, poilist):
        timestr = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        keys = list(poilist.keys())
        values = list(poilist.values())
        sqlstr = f" INSERT ignore  INTO jdospider.parkingstationinfo({', '.join(keys)}, createTime, lastgetTime) VALUES("
        for value in values:
            sqlstr += f"'{value}',"
        sqlstr = sqlstr+ f"'{timestr}', '{timestr}')"
        logger.debug(sqlstr)
        try:
            self.db.handle(sqlstr)
        except Exception as e:
            logger.error(str(e))
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-15 11:13

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表