Python MySQL –从Python表中查询数据

时间:2019-11-20 08:52:39  来源:igfitidea点击:

本教程向您展示如何使用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数据库查询数据的各种方法。
通过在检索数据的时间和存储结果集所需的内存之间取得平衡,了解每种技术非常重要。