Python-MySQL动态表名选择查询

Python-MySQL动态表名选择查询,python,mysql,sql,select,Python,Mysql,Sql,Select,我试图用Python从MySQL数据库中获取所有行。当表名为变量时,如何从表中提取所有行 这是我写的一个方法,但是在运行它的时候出现了错误 def get_rows(self, table_name): cursor = self.conn.cursor() query = ("SELECT * " "FROM %s ") try: cursor.execute(query, (table

我试图用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:“非类型”对象没有属性“游标”


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

您不能动态地将对象名(这里您试图绑定表名)或语法结构绑定到查询。如果您希望有这样的行为,您必须求助于字符串操纵,这意味着您将丧失预处理语句提供的所有安全优势:

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

您对conn对象有问题


“NoneType”对象没有属性“cursor”意味着conn是None,这可能是因为它不是在_u; init _;调用期间建立的

多谢各位。我现在明白了它将如何丧失安全优势,特别是如果表名称来自用户。我尝试了您的建议,但仍然出现以下错误:AttributeError:“NoneType”对象没有属性“cursor”,我也尝试过:
query=“SELECT*FROM%s”%table\u name try:cursor.execute(query)
still,没有运气。@kreenameta您确定数据库中确实存在该表吗?是,当我查询时,在代码中给出表的名称。它返回我所有的行。当在MySQL工作台上查询时,它也可以正常工作。谢谢,这个解决方案就是有效的。我通过我的代码进行了调试。在运行此方法之前,我还有一个数据库调用。在上一次调用的末尾,我有:
cursor.close()self.conn.close()
这可能是因为什么原因吗?您可能应该在数据库管理类的_; del _;方法中定义self.conn.close。因此,在每次数据库调用之后,是否会调用del方法?或者,在执行所有DB操作后,只调用一次。对不起,如果我的问题很愚蠢的话。事实上,我是新来的。我发明了一种新方法。我在里面写了self.conn.close()。最后我调用了它(在执行了所有DB调用之后)。而且效果很好!谢谢:)每当一个对象的实例即将被销毁时,就会调用_; del _;。我不确定对象的生命周期是什么,以及最初在哪里创建数据库连接。如果在应用程序启动时定义db连接,则在应用程序的生命周期内保持其打开是有意义的。如果在创建具有get_rows方法的对象时建立连接,则在该对象被销毁时关闭连接是合理的。