【问题标题】:Fetching data from postgres database on jupyter notebook从 jupyter notebook 上的 postgres 数据库中获取数据
【发布时间】:2022-11-18 17:38:43
【问题描述】:

我正在使用此脚本从 Postgres 数据库中获取数据。

POSTGRES_PORT = 'xxxx'
POSTGRES_USERNAME = 'xxx' ## CHANGE THIS TO YOUR PANOPLY/POSTGRES USERNAME
POSTGRES_PASSWORD = 'xxx' ## CHANGE THIS TO YOUR PANOPLY/POSTGRES PASSWORD POSTGRES_DBNAME = 'xxxx' ## CHANGE THIS TO YOUR DATABASE NAME
POSTGRES_DBNAME = 'xxx'

postgres_str = (f'postgresql://{POSTGRES_USERNAME}:{POSTGRES_PASSWORD}@{POSTGRES_ADDRESS}:{POSTGRES_PORT}/{POSTGRES_DBNAME}')
# Create the connection
cnx = create_engine(postgres_str)

当我使用限制时,我能够获取它。

table_name = pd.read_sql_query("""SELECT * FROM public.timeline limit 1000""", cnx)
table_name

当我尝试无限制地获取时,出现此错误

在这种情况下,您会推荐我使用 pyspark 吗?看起来数据是大数据?

我使用计数,得到“66231781”行。

【问题讨论】:

  • 最好准确粘贴阻止您获取结果的错误。现在我只能猜测限制是你的memory。在那种情况下,如果您尝试将整个表及其所有列一次拉到一个对象中,我认为无论您使用什么工具,这都会有问题。
  • 你好@Zegarek,刚刚添加了我的错误消息

标签: python postgresql


【解决方案1】:

默认情况下,Postgresql 的数据库驱动程序使用客户端游标,但您可以使用服务器端游标并将数据分批流式传输到客户端。以下代码将按照 chunksize 参数的设置,以 1,000 行为一组遍历查询结果。您可以调整chunksize的值以满足您的需要。

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine(f"postgresql://{POSTGRES_USERNAME}:{POSTGRES_PASSWORD}@{POSTGRES_ADDRESS}:{POSTGRES_PORT}/{POSTGRES_DBNAME}")

with engine.connect().execution_options(stream_results=True) as conn:
    for chunk_df in pd.read_sql("SELECT * FROM public.timeline", conn, chunksize=1000):
        print(f"Dataframe has {len(chunk_df)} rows.")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多