Python:读取数据库以显示具有相等列的表

时间:2019-05-02 19:53:55

标签: python sql database sqlite

当我当前从数据库中读取数据时,我有一个程序,可以在here中找到它。我让用户选择他们想要显示的特定记录,以便SQL命令将执行该记录。现在,我有了一个当前显示这些记录的表,但是,这些列并不是我想要的样子,因为我正在处理很长的数据字符串。

我没有使用任何扩展库。除某些表格(例如供应商,订单,类别)外,其他表格的表格显示是相同的。每列的宽度太长。占用太多空间。

我认为我的代码当前从整个表中获取最长的字符串,并为每一列设置其宽度。我要执行的操作是为每一列而不是整个表采用最长的字符串,因此每列的宽度由该列的字符串长度(当然还有一点额外的空间)设置。

到目前为止,这是我的代码:

import sqlite3

def read_display(record):
  database = 'data.db'
  connection = sqlite3.connect(database)
  c = connection.cursor()
  # selects a table to display
  sql = "SELECT * FROM {0}".format(record)
  cursor.execute(sql)
  conn.commit()
  results = cursor.fetchall()

  header = [i[0] for i in c.description]
  data = [header] + list(tuple(results))
  width = max((len(str(x)) for d in data for x in d))

  for i, d in enumerate(data):
      line = ' | '.join(str(x).ljust(width) for x in d)
      print(line)
      if i == 0:
         print('-' * len(line))

我试图弄乱width变量,但似乎无法弄清楚。我尝试查看其他StackOverflow q,但它们处理的数据很少,因此更容易设置宽度。该数据包含巨大的字符串。

非常感谢!

1 个答案:

答案 0 :(得分:0)

  

评论_#2 中是什么意思?

阅读What is the purpose of the single underscore “_” variable in Python?
在这里,“ 3。作为通用的“丢弃”变量名” ,我们不需要range(...值。


  

问题:将数据库记录显示为具有相等列的表

  1. 获取列名并将其添加到results之前。

        header = tuple(i[0] for i in cur.description)
        data = [header] + results
    
  2. 使用configlist初始化为{'width':0}
    创建与数据库表中的列一样多的dict项。

        config = [{'width':0} for _ in range(len(data[0]))]
    
  3. 环绕整个数据,该数据是list中的tuple
    找到max len并将其存储在config dict列中

        for rec in data:
            for c, value in enumerate(rec):
                config[c]['width'] = max(config[c]['width'], len(str(value)))
    
  4. 使用format list中的width准备config

        format_ = []
        for f in config:
            format_.append('{:<' + str(f['width']) + '}')
    
  5. 使用list format_作为分隔符将str转换为'|'

        format_ = ' | '.join(format_)
    
  6. 环绕data的{​​{1}},list,使用tuple字符串打印。

    format_

使用Python测试:3.5