【问题标题】:How to update a PostgreSQL table with a list in Python?如何使用 Python 中的列表更新 PostgreSQL 表?
【发布时间】:2021-06-07 08:29:15
【问题描述】:

我在 PostgreSQL 中有下表:

CREATE TABLE stock_prices (
    ticker VARCHAR(32),
    time TIMESTAMP,
    open FLOAT8,
    high FLOAT8,
    low FLOAT8,
    close FLOAT8,
    volume FLOAT8,
    PRIMARY KEY (ticker, time)
) PARTITION BY LIST (ticker);

并希望通过 Python 服务器中的 SQLAlchemy 对其进行更新。 我从一个数组中的 API 获取我的数据,其中包含以毫秒为单位的时间戳列、开盘价、最高价、最低价、收盘价和交易量。 Apple 示例(股票代码 = AAPL):

timestamp, opening price, highest price, lowest price, closing price, volume
[[1264982400000,6.870357036590576,7,6.8321428298950195,6.9546427726745605,749876400],
[1265068800000,6.996786117553711,7.0114288330078125,6.906428813934326,6.994999885559082,698342400],
[1265155200000,6.9703569412231445,7.150000095367432,6.943571090698242,7.115356922149658,615328000],
...]

用数组的主条目更新表 stock_prices WHERE ticker = 'AAPL' 的列的最佳方法是什么?

【问题讨论】:

  • 您尝试过什么来实现这一目标?请查看How to ask 提出一个好问题!
  • 我以前每只股票都有一个表格,但现在我处理的股票越来越多,表格的数量越来越多。当我为每只股票创建一个表时,我使用了 pandas 的 to_sql() 函数,但我不知道在使用分区表时如何获得类似的结果。

标签: python sql postgresql sqlalchemy


【解决方案1】:

如果有人偶然发现这个问题,我是这样解决的:

            df = pd.DataFrame(tOHLCV, columns=['time', 'open', 'high', 'low', 'close', 'volume'])

            df['time'] = pd.to_datetime(df['time'] * 1_000_000)

            df.set_index('time')

            df.to_sql(f'{ticker}_tmp', db.engine, if_exists='replace')

            sql += f'''
                CREATE TABLE IF NOT EXISTS {ticker}_partition
                PARTITION OF stock_prices
                FOR VALUES IN ('{ticker}');

                INSERT INTO stock_prices (
                    ticker,
                    time,
                    open,
                    high,
                    low,
                    close,
                    volume
                )
                SELECT
                    '{ticker}',
                    time,
                    open,
                    high,
                    low,
                    close,
                    volume
                FROM public."{ticker}_tmp"
                ON CONFLICT DO NOTHING
                ;                
            '''

            sql += f'''
                DROP TABLE public."{ticker}_tmp";
            '''

            db.session.execute(sql, values)
            db.session.commit()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2019-08-27
    • 2021-01-08
    • 2021-12-27
    • 2012-11-08
    相关资源
    最近更新 更多