查询数据库postgreSQL

时间:2019-01-12 13:26:26

标签: python-3.x postgresql psycopg2

下午好,我研究了使用python中的postgresql的库,它写在说明中:

  

永远不要,永远不要使用Python字符串串联(+)或字符串参数插值(%)将变量传递给SQL查询字符串。甚至没有枪口。

我想从reports表的第object, data列中输出 我试图做一个这样的功能:

def select(self, column, table):
    with conn.cursor() as cursor:
        stmt = sql.SQL('SELECT {} FROM {}').format(
            sql.Identifier(column),
            sql.Identifier(table))
        cursor.execute(stmt)
        for row in cursor:
            print(row)

但是我得到一个错误:

psycopg2.ProgrammingError: column "object, data" does not exist
LINE 1: SELECT "object, data" FROM "object"

我使用以下功能设法达到了预期的效果:

def select(self, column, table):
    with conn.cursor() as cursor:
        cursor.execute("SELECT %s FROM %s" %(column,table))
        return cursor.fetchall()

能否请您告诉我如何在不使用%s的情况下创建函数?

1 个答案:

答案 0 :(得分:0)

代替传递字符串列,您应该具有要传递的列名称的列表。现在,您可以使用sql.SQL(', ').join()来加入他们。

def select(self, columns, table):
    with conn.cursor() as cursor:
        stmt = sql.SQL('SELECT {} FROM {}').format(
            sql.SQL(', ').join(sql.Identifier(n) for n in columns),
            sql.Identifier(table))
        cursor.execute(stmt)
        for row in cursor:
            print(row)