在Python中通过查询与Excel文件内连接数据库表

问题描述 投票:0回答:1

我需要在 Amazon Redshift 中的表和 Excel 表之间执行内部联接。数据库表相当大,我只需要提取 Excel 文件中的 ID,其中包含大量 ID 列表(大约 30,000 个)。

我尝试将 Excel 表格直接包含到执行函数中,但遇到了问题。 如何正确地做到这一点?

id_table=df['id']
def query_():
    query =f"""
        SELECT distinct 
        t1.id, t1.value
        FROM table1 t1 
       inner join  (SELECT id2 from %s ) as t2
        on t1.id=t2.id2

    """
    return query

def get_dataframe2():
    query = query_()
    with psycopg2.connect(dbname=database_, host=server_, user=username_, password=password_, port=port_) as conn:
        with conn.cursor() as cur:
            cur.execute(query,(id_table,))
            # cur.execute(query)
            success = False
            while not success:
                try:
                    data = cur.fetchall()
                    success = True
                except:
                    cur.nextset()

    cols = ['id','value']
    return pd.DataFrame(data, columns=cols)

python sql pandas excel amazon-redshift
1个回答
0
投票

我能够解决这个问题,所以我想分享我使用的代码,以防有人尝试做同样的事情。如果您有更有效的方法,请评论或提供其他回复,但这对我有用。

  1. 将 Excel 文件中的 ID 转换为元组

    id_tuples=tuple(df['id'].drop_duplicates().astype(str).tolist())

  2. 将数据库表与使用以下查询创建的表进行内连接

    ( SELECT id2 from ( select array{id_tuples} AS id ) as ids, ids.id as id2) as I

    总而言之,这会创建一个名为 ids 的派生表或子查询,其中它将 id_tuples 列表转换为数组并为其分配一个别名 id。然后,它选择该数组的元素作为 id2。最后,它将结果别名为 I

最终代码如下

id_tuples=tuple(df['id'].drop_duplicates().astype(str).tolist())
def query_():
    query =f"""
        SELECT distinct 
        t1.id, t1.value
        FROM table1 t1 
       inner join  
      ( SELECT id2 from (  select array{id_tuples} AS  id ) as ids, ids.id as id2) as I on I.id2=t1.id
      

    """
    return query

def get_dataframe2():
    query = query_()
    with psycopg2.connect(dbname=database_, host=server_, user=username_, password=password_, port=port_) as conn:
        with conn.cursor() as cur:
            cur.execute(query)
            # cur.execute(query)
            success = False
            while not success:
                try:
                    data = cur.fetchall()
                    success = True
                except:
                    cur.nextset()

    cols = ['id','value']
    return pd.DataFrame(data, columns=cols)
© www.soinside.com 2019 - 2024. All rights reserved.