【问题标题】:Python querying mysql iterativelyPython迭代查询mysql
【发布时间】:2016-10-11 21:59:55
【问题描述】:

我有一个我想从 mysql 数据库中提取的列名列表。循环遍历它并每次查询是一种好习惯吗?

当我这样做时,有时/随机它似乎挂起;当我重新启动脚本时,它会在不同的迭代中挂起。在我继续尝试破译问题所在之前,首先想知道这是否是不好的做法。

import mysql.connector
import numpy as np

cnx = mysql.connector.connect(user='user', password='pw', host='ip_here')
for i,j in enumerate(columnList):
   cursor.execute('SELECT `' + j + '` FROM `table_name`')
   iValues = cursor.fetchall()
   cursor.close
   if i == 0:
      extractedValues = iValues
   else:
      extractedValues = np.hstack((extractedValues, iValues))

cnx.close

【问题讨论】:

  • 不知道是谁让你循环访问数据库的。这不是一个好主意。获取本地或内存中所需的所有数据,并循环访问获取的数据。列中的 200 项意味着 400 次往返 db 的旅行,而只有两次。这应该可以解决问题。

标签: python mysql sql database mysql-python


【解决方案1】:

一次查询一个列是很奇怪的,因为您无法将一列中的值与另一列相关联。除非您的表格是一堆不相关的数据(不是真正的记录,即您的表格根本没有标准化),否则这将从数据中删除所有含义。如果您尝试处理动态或可变列,您可以构建一个动态查询字符串(附加列名、逗号、列名、逗号...),然后执行该查询。我很难想到查询单个列而不是行/记录是有用的场景。

【讨论】:

  • 感谢 Chris 提出这个问题;之前没有考虑过。将当前列作为行对我来说更有意义,反之亦然,但不幸的是我的数据不符合 innodb 的当前列限制(因为我将有超过 20,000 列)。我想我应该切换到 cassandra 左右。
【解决方案2】:

试试这样的...未测试:

cnx = mysql.connector.connect(user='user', password='pw', host='ip_here')
cursor.execute('SELECT * FROM database.`table_name`')
iValues = cursor.fetchall()
cursor.close
cnx.close

#for i,j in enumerate(iValues):
#   if i == 0:
#      extractedValues = iValues
#   else:
#      extractedValues = np.hstack(())
extractedValues =  list(iValues)

【讨论】:

    【解决方案3】:

    你应该试试这个,它只会得到你需要的列,每一列都在一行中,只有一个选择:

      import mysql.connector
      import numpy as np
    
      cnx = mysql.connector.connect(user='user', password='pw', host='ip_here')
    
      cursor.execute('SELECT ' + ['`' + col + '`' for col in columnList].join(',') + ' FROM `table_name`')
      values = cursor.fetchall()
    
      # now values variable has the data in the columns you need
    

    由于列表理解,不需要for,它会生成一个类似的选择

      SELECT `COLa`, `COLb`, `COLc` FROM `table_name`;
    

    然后执行一次,获取values变量中的数据

    【讨论】:

    • 答案有什么需要改进的地方吗?为什么投反对票?
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多