本教程向您展示如何使用 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()
Code language: Python (python)
让我们详细检查一下代码:
- 首先,通过创建新的
MySQLConnection
对象连接到数据库 - 接下来,从
MySQLConnection
对象实例化一个新的MySQLCursor
对象 - 然后,执行一个查询,从
books
表中选择所有行。 - 之后,通过调用
fetchone()
获取结果集中的下一行。在while loop
块中,显示该行的内容并移至下一行,直到获取所有行。 - 最后,通过调用相应对象的
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()
Code language: Python (python)
除了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
Code language: Python (python)
其次,使用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()
Code language: Python (python)
在本教程中,您学习了使用 Python 从 MySQL 数据库查询数据的各种方法。通过平衡检索数据的时间和存储结果集所需的内存来理解每种技术非常重要。