2016-03-07 358 views
1

我试图从Python中的MySQL数据库中获取所有行。如何从表中获取所有行,何时表名是可变的?Python - 使用动态表名称的MySQL SELECT查询

这是我写的一个方法,但是我在运行时遇到错误。

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”对象有没有属性“光标”

我相信我写的查询错误。任何人都可以帮我弄清楚这样做吗?我在WHERE cluase中尝试了类似的方式,它工作正常。

任何帮助将不胜感激!
谢谢!

回答

2

您有康恩对象的问题。

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

+0

我通过我的代码进行调试。在运行此方法之前,我还有一个数据库调用。在上次调用结束时,我有: 'cursor.close() self.conn.close()' 难道是因为这个原因? –

+0

您可能应该在您的数据库管理类的__ del __方法内定义self.conn.close。 –

+0

因此,在每次数据库调用之后,将调用__del__方法?或者在所有数据库操作执行后仅调用一次。对不起,如果我的问题很蠢。我其实是新手。 –

0

您不能动态地将对象名称(这里您试图绑定表名)或语法结构绑定到查询。如果你想有这样的行为,你不得不诉诸字符串操作,这意味着你丧失所有的安全优势预处理语句提供:

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

谢谢。我现在明白,如何放弃安全优势,特别是如果table_name来自用户。我尝试了你的建议,但我仍然收到以下错误: AttributeError:'NoneType'对象没有属性'cursor' –

+0

我也试过: 'query =“SELECT * FROM%s”%table_name try: cursor。执行(查询)' 仍然没有运气。 –

+0

@KreenaMehta你确定这个表格实际存在于你的数据库中吗? – Mureinik