我是 python 的初学者。我想将 sql 结果转换为列表。这是我的代码:
cursor = connnect_db()
query = "SELECT * FROM `tbl`"
cursor.execute(query)
options = list()
for i,row in enumerate(cursor.fetchall()):
options.append(row[i])
我的表中有 6 列,但这段代码没有创建 6 个元素列表。我在哪里做错了?
如果你在 Python 中有一个可迭代对象,要创建一个列表,可以简单地调用内置的list()
:
list(cursor.fetchall())
请注意,可迭代对象通常与列表一样有用,并且可能更有效,因为它可以是惰性的。
您的原始代码失败,因为它没有太大意义。您遍历行并枚举它们,因此您得到(0, first_row), (1, second_row)
,等等... - 这意味着您正在构建每个第 n 行的第 n 个项目的列表,这根本不是您想要的。
这段代码显示了一些问题 - 首先,list()
不带任何参数通常最好用空列表文字 ( []
) 替换,因为它更易于阅读。
接下来,您尝试按索引循环,这在 Python 中是个坏主意。循环值本身,而不是您用来获取值的索引。
另请注意,当您确实需要构建这样的值列表时,列表推导是最好的方法,而不是创建一个列表,然后附加到它。
cursor = connnect_db()
query = "SELECT * FROM `tbl`"
cursor.execute(query)
result = cursor.fetchall() //result = (1,2,3,) or result =((1,3),(4,5),)
final_result = [list(i) for i in result]
当我使用 Sudhakar Ayyar 的答案时,结果是一个列表列表,而不是由 .fetchall() 创建的元组列表。这仍然不是我想要的。对他的代码稍作改动,我就可以得到一个简单的列表,其中包含来自 SQL 查询的所有数据:
cursor = connnect_db()
query = "SELECT * FROM `tbl`"
cursor.execute(query)
result = cursor.fetchall() //result = (1,2,3,) or result =((1,3),(4,5),)
final_result = [i[0] for i in result]
此外,最后两行可以合并为:
final_result = [i[0] for i in cursor.fetchall()]
只需调用 list( cursor ),如下所示。
import pymysql
# Create the database connection.
# The connection parameters are host, port, user, password, and database.
# These parameters in this code are held in the app.config().
dump_conn = pymysql.connect(
host=app.config[ 'DUMP_SQLALCHEMY_HOST' ],
port=int( app.config[ 'DUMP_SQLALCHEMY_PORT' ] ),
user=vault[ 'data' ][ 'username' ],
passwd=vault[ 'data' ][ 'password' ],
db=app.config[ 'DUMP_SQLALCHEMY_DB' ]
)
# Grab the query from a sql_queries helper file.
sql_query = query_transactions_for_csv()
# From the connection get a cursor.
dump_cursor = dump_conn.cursor()
# Handle the cursor.close() with a 'with' statement.
with dump_cursor as cursor:
# Execute the query.
cursor.execute( sql_query )
# Use list( cursor ) to get a Python list.
rows = list( cursor )
如果您使用的是存储过程,您可以将结果转换为这样的列表。
cursor = connection.cursor()
parameters = []
cursor.callproc('spProcedureName', parameters)
resultList =[r.fetchall() for r in cursor.stored_results()][0]
cursor.close()