python 3.5从postgres数据库中选择和使用结果

Posted

技术标签:

【中文标题】python 3.5从postgres数据库中选择和使用结果【英文标题】:python 3.5 selecting and using results from postgres database 【发布时间】:2017-06-16 14:58:07 【问题描述】:

我需要编写一个程序,该程序首先可以获取在 google 上看到我的广告系列的人的 IP 地址,然后向我提供每个人的详细信息。

我在 postgres 数据库中有所有信息并使用 python 3.5

这是我的代码:

def get_connection(cursor_factory=None):
    conn_string_pg = "host= '" + host + "' dbname = '" + dbname + "' user = '" + user + \
                 "' password = '" + password + "'"
    if cursor_factory is None:
        conn_pg = psycopg2.connect(conn_string_pg)
    else:
        conn_pg = psycopg2.connect(conn_string_pg, 
        cursor_factory=cursor_factory)
    return conn_pg



def find_logs():

    select = """ select ip_address from log_files o where o.url like 
    '%my_campaign'  
    """
    conn = get_connection(cursor_factory = RealDictCursor)
    cur = conn.cursor()
    cur.execute(select)
    records = cur.fetchone()
    for item in records:
        select_2 = "select * from log_files where ip_address = %(item)s "
        cur.execute(select_2)
        logs = cur.fetchone()
        return logs

print(find_logs())
cur.close()

不幸的是,我收到了这个错误:

psycopg2.ProgrammingError:“%”第 1 行或附近的语法错误: ...选择 * from web_logs.log_data where ip_address = %(item)s o...

【问题讨论】:

【参考方案1】:

您的字符串插值不正确。您试图将 item 的值插入到您的 select_2 语句中,但您实际上并没有进行字符串插值,因此您向 psycopg2 传递了一个无效的 SQL 语句。你想做类似的事情

 select_2 = "select * from log_files where ip_address = ".format(item)

【讨论】:

【参考方案2】:

这是因为ip_address = %(item)s 不是有效的 sql 语法。您应该在之前进行字符串格式化:

select_2 = "select * from log_files where ip_address = %(item)s " % 'item': item

更好的方法是把所有的转换都交给 postgres 驱动

select_2 = "select * from log_files where ip_address = %s "
cur.execute(select_2, (item, ))

【讨论】:

感谢 Oleksandr 的快速回复。第二个解决方案非常好,但是使用 cur.execute(select_2, item['ip_address']) 我收到一个错误:TypeError: string indices must be integers

以上是关于python 3.5从postgres数据库中选择和使用结果的主要内容,如果未能解决你的问题,请参考以下文章

Postgres - 从多个有序行中选择非空白非空值

抓取:将存储为图片的数据添加到 python 3.5 中的 CSV 文件

从 Python 将随机数据存储在 Postgres 数据库中

python pyscopg2 无法从 AWS redshift 中选择数据

R:如何使用 dplyr(函数 scr_postgres)从 redshift 中的模式中选择表?

postgres_fdw 无法连接到 Amazon RDS 上的服务器