孙云 发表于 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

用你的变量 拼接sql语句执行就可以了

iawyxkdn8 发表于 2022-8-31 09:27

听说这个拼接就可以的

lz6905 发表于 2022-8-31 09:31

其实只要几个关键语句就可以实现所有操作,1.连接,2执行SQL(无返回值--设置,新建等,有返回值查询),2关闭连接。
这是我写python里面的一些关键语句:
1、连接
    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)无返回
    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)有返回
    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、关闭
    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 编辑

字段和值可以打包成字典传到函数    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 ignoreINTO 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))
页: [1] 2
查看完整版本: Python怎么优雅实现更新MySQL数据库不固定的字段数量