这个主题已经涵盖了。如果是这样,请为此道歉。从数据库中获取行(使用“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()
答案 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()
一起使用,即使我们不关心结果