Py:从数据库中获取并从控制台执行脚本时限制

时间:2017-01-23 22:38:15

标签: python for-loop while-loop console pymysql

这个主题已经涵盖了。如果是这样,请为此道歉。从数据库中获取行(使用“for”和“while”循环)并从控制台执行脚本时出现问题。

我需要从数据库中获取大量行,并且我正在构建一个脚本,以便我可以插入用户ID,并且我将获得客户端的帐户ID和状态。 我已经意识到当我从Eclipse运行脚本时,从DB获取完整输出。当我从控制台运行脚本时,行数有限制。所以,我想知道我是否有“while row is not None”循环...如果数据库中有更多行,为什么我的行变为None?

另外:我需要解决这个问题。不管怎样。我宁愿不将完整列表加载到本地文件(如果可能)。但是,如果没有别的办法......好的,请帮助!!这是我的榜样。

#!/usr/bin/env python3
# encoding: utf-8

import configparser
import pymysql
from prettytable import PrettyTable

conn = pymysql.connect(host=host, user=user, passwd=password, db=database)

print()
userid = input('Insert User ID(s) > ') # userid is a list of 2000 users in comma-separated format
userids = userid.replace(" ", "").replace("'", "").replace(",", "','")
cur = conn.cursor()
cur.execute(""" SELECT user_ID, account_ID, status FROM Account WHERE user_ID IN ('%s'); """ % userids)
rows = cur.fetchall()

table = PrettyTable(["user_ID", "account_ID", "status"])
table.padding_width = 1

for line in rows:
    user_ID = str(line[0])
    account_ID = str(line[1])
    status = str(line[2])
    table.add_row([user_ID, account_ID, status])

print()
print(table)
conn.close()
print()
print()
exit()

1 个答案:

答案 0 :(得分:0)

如果不对代码进行过多修改,您可以尝试使用prettytable模块提供的from_db_cursor(),如下所示:

#!/usr/bin/env python3

import pymysql
from prettytable import from_db_cursor

conn = pymysql.connect(host=host, user=user, passwd=password, db=database)

userid = input('Insert User ID(s) > ') # userid is a list of 2000 users in comma-separated format
userids = userid.replace(" ", "").replace("'", "").replace(",", "','")
cur = conn.cursor()
cur.execute(""" SELECT user_ID, account_ID, status FROM Account WHERE user_ID IN ('%s'); """ % userids)

table = from_db_cursor(cur, padding_width=1)

print(table)
conn.close()

但是看一下prettytable的源代码,我的猜测是它不会改变这种情况,因为它会或多或少地在你的代码中明确地做了什么。

可能更好的方法是一次向table添加一行,而不是获取所有行并循环遍历它们以添加它们。类似的东西:

#!/usr/bin/env python3

import pymysql
from prettytable import PrettyTable

conn = pymysql.connect(host=host, user=user, passwd=password, db=database)

userid = input('Insert User ID(s) > ') # userid is a list of 2000 users in comma-separated format
userids = userid.replace(" ", "").replace("'", "").replace(",", "','")
cur = conn.cursor()
cur.execute(""" SELECT user_ID, account_ID, status FROM Account WHERE user_ID IN ('%s'); """ % userids)
row = cur.fetchone()

table = PrettyTable(["user_ID", "account_ID", "status"], padding_width=1)

while row is not None:
    table.add_row(row)
    row = cur.fetchone()

print(table)
conn.close()

您不需要将行元素转换为字符串值,因为Prettytable在内部执行此操作。

但是可以利用不同的功能来简化代码并使其更加pythonic:

#!/usr/bin/env python3

import re
import pymysql
from prettytable import PrettyTable

userid = input('Insert User ID(s) > ') # userid is a list of 2000 users in comma-separated format
userids = re.sub("[ ']", "", userid).replace(",", "','")

table = PrettyTable(["user_ID", "account_ID", "status"], padding_width=1)

with pymysql.connect(host=host, user=user, passwd=password, db=database) as cur:
    cur.execute("""SELECT user_ID, account_ID, status FROM Account WHERE user_ID IN ('%s'); """ % userids)

    map(table.add_row, cur)

print(table)

在此版本中:

  • 我已经使用re.sub()进行了一些替换(有些人可能会说这有点过分,但将来对你有用)
  • Pymysql连接implements context manager直接为您提供游标。
  • 由于Pymysql光标可以provide iterator,我们可以将其与map()一起使用,即使我们不关心结果