【问题标题】:Python - MySQL SELECT query with dynamic table namePython - 具有动态表名的 MySQL SELECT 查询
【发布时间】:2016-03-07 18:18:37
【问题描述】:

我正在尝试从 Python 中的 MySQL 数据库中获取所有行。当表名可变时,如何从表中获取所有行?

这是我编写的一个方法,但是在运行它时出现错误。

def get_rows(self, table_name):
    cursor = self.conn.cursor()
    query = ("SELECT * "
              "FROM %s ")
    try:
        cursor.execute(query, (table_name,))
        value = cursor.fetchall()
    finally:
        cursor.close()
    return value

我收到以下错误:

AttributeError: 'NoneType' 对象没有属性 'cursor'

我在WHERE 子句中尝试了类似的方法,效果很好。

【问题讨论】:

    标签: python mysql sql select


    【解决方案1】:

    您的 conn 对象有问题。

    'NoneType' 对象没有属性 'cursor' 意味着 conn 是 None,可能是因为它不是在 __ init __ 调用期间建立的。

    【讨论】:

    • 我调试了我的代码。在运行此方法之前,我还有 1 个数据库调用。在上次通话结束时,我有:cursor.close() self.conn.close() 会不会是因为那个?
    • 您可能应该在数据库管理类的 __ del __ 方法中定义 self.conn.close。
    • 那么在每次数据库调用之后,会不会调用del方法呢?或者在所有 DB 操作执行完毕后只调用一次。对不起,如果我的问题很愚蠢。我实际上是新手。
    • 我做了一个新方法 __ del __ 。我在里面写了self.conn.close()。我最后调用了它(在执行所有数据库调用之后)。而且效果很好!谢谢你:)
    • 每当一个对象的实例即将被销毁时,都会调用 __ del __。我不确定对象的生命周期是什么,以及您最初创建数据库连接的位置。如果您在应用程序启动时定义数据库连接,那么在应用程序的整个生命周期内保持打开状态是有意义的。如果在创建具有 get_rows 方法的对象时建立连接,那么在该对象被销毁时关闭连接是合理的。
    【解决方案2】:

    您不能将对象名称(在这里您尝试绑定表名称)或语法结构动态绑定到查询。如果您希望有这样的行为,您将不得不求助于字符串操作,这意味着您将丧失准备好的语句提供的所有安全优势:

    query = ("SELECT * FROM %s" % table_name)
    try:
        cursor.execute(query, ())
    

    【讨论】:

    • 谢谢。我现在明白它将如何丧失安全优势,特别是如果 table_name 来自用户。我尝试了你的建议,但我仍然收到以下错误:AttributeError: 'NoneType' object has no attribute 'cursor'
    • 我也试过了:query = "SELECT * FROM %s " % table_name try: cursor.execute(query) 仍然没有运气。
    • @KreenaMehta 您确定该表确实存在于您的数据库中吗?
    • 是的,当我查询在代码中给出 table_name 时。它返回我所有的行。在 MySQL Workbench 上查询时也可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2023-01-02
    • 2015-09-17
    • 1970-01-01
    相关资源
    最近更新 更多