Python MySQL –从Python表中查询数据
本教程向您展示如何使用MySQL Connector / Python API(例如fetchone(),fetchmany()和fetchall())从Python中的MySQL数据库查询数据。
要从Python查询MySQL数据库中的数据,您需要执行以下步骤:
连接到MySQL数据库,您将获得一个MySQLConnection对象。
从MySQLConnection对象实例化一个MySQLCursor对象。
使用游标通过调用其execute()方法来执行查询。
使用fetchone(),fetchmany()或fetchall()方法从结果集中获取数据。
通过调用相应对象的close()方法来关闭游标以及数据库连接。
我们将在以下各节中详细介绍如何使用fetchone(),fetchmany()和fetchall()方法。
使用fetchone()方法查询数据
fetchone()方法返回查询结果集的下一行;如果没有剩余行,则返回None。
让我们看一下以下代码:
from mysql.connector import MySQLConnection, Error from python_mysql_dbconfig import read_db_config def query_with_fetchone(): try: dbconfig = read_db_config() conn = MySQLConnection(**dbconfig) cursor = conn.cursor() cursor.execute("SELECT * FROM books") row = cursor.fetchone() while row is not None: print(row) row = cursor.fetchone() except Error as e: print(e) finally: cursor.close() conn.close() if __name__ == '__main__': query_with_fetchone()
让我们详细检查一下代码:
首先,通过创建一个新的MySQLConnection对象连接到数据库
接下来,从MySQLConnection对象实例化一个新的MySQLCursor对象
然后,执行一个查询,从books表中选择所有行。
之后,通过调用fetchone()获取结果集中的下一行。
在while循环块中,显示该行的内容并移至下一行,直到获取所有行。最后,通过调用相应对象的close()方法来关闭游标和连接对象。
注意,我们使用了在连接MySQL数据库教程中创建的模块python_mysql_dbconfig.py中的函数read_db_config()。
使用fetchall()方法查询数据
如果表中的行数很少,则可以使用fetchall()方法从数据库表中获取所有行。
请参阅以下代码。
from mysql.connector import MySQLConnection, Error from python_mysql_dbconfig import read_db_config def query_with_fetchall(): try: dbconfig = read_db_config() conn = MySQLConnection(**dbconfig) cursor = conn.cursor() cursor.execute("SELECT * FROM books") rows = cursor.fetchall() print('Total Row(s):', cursor.rowcount) for row in rows: print(row) except Error as e: print(e) finally: cursor.close() conn.close() if __name__ == '__main__': query_with_fetchall()
逻辑与fetchone()方法的示例相似,不同之处在于fetchall()方法的调用部分。
由于我们已将books表中的所有行都提取到内存中,因此可以使用游标对象的rowcount属性获取返回的总行数。
使用fetchmany()方法查询数据
对于相对较大的表,需要花费一些时间来获取所有行并返回整个结果集。
此外,fetchall()需要分配足够的内存以将整个结果集存储在内存中,这效率不高。
MySQL Connector / Python具有fetchmany()方法,该方法返回结果集的下一个行数(n),这使您可以在检索时间和内存空间之间取得平衡。
首先,开发一个生成器,将数据库调用分块为一系列fetchmany()调用:
def iter_row(cursor, size=10): while True: rows = cursor.fetchmany(size) if not rows: break for row in rows: yield row
其次,使用iter_row()生成器一次获取10行:
def query_with_fetchmany(): try: dbconfig = read_db_config() conn = MySQLConnection(**dbconfig) cursor = conn.cursor() cursor.execute("SELECT * FROM books") for row in iter_row(cursor, 10): print(row) except Error as e: print(e) finally: cursor.close() conn.close()
在本教程中,您学习了使用Python从MySQL数据库查询数据的各种方法。
通过在检索数据的时间和存储结果集所需的内存之间取得平衡,了解每种技术非常重要。