我需要在 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)
我能够解决这个问题,所以我想分享我使用的代码,以防有人尝试做同样的事情。如果您有更有效的方法,请评论或提供其他回复,但这对我有用。
将 Excel 文件中的 ID 转换为元组
id_tuples=tuple(df['id'].drop_duplicates().astype(str).tolist())
将数据库表与使用以下查询创建的表进行内连接
( 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)