数据库:插入、更新记录(insert into, ..., on duplicate key)

接收到tick数据,合成成实时1分钟的K线。

不是1分钟K线来一根,而是在1分钟内,最后一根K线的 H、L、C 在不断变化。

用 insert into 同时 on duplicate key,就能解决这个问题。

MySQL

sql = """INSERT INTO {TABLE_NAME} ({time_col_name}, `code`, `open`, `high`, `low`, `close`, `volume`) VALUES
	('{RT_TIME}', '{code}', {open}, {high}, {low}, {close}, {volume})
	ON DUPLICATE KEY UPDATE `high` = IF (`high` > {high},`high`,{high}),
    `low` = IF (`low` < {low},`low`, {low}), `close` = {close}, `volume` = {volume};
    """.format(**format_data)

主键要设置为 (time, code),这两个字段作为联合PK。

PostgreSQL

    sql = """INSERT INTO {TABLE_NAME} (trade_date, ticker, open, high, low, close) VALUES
         ('{RT_TIME}', '{ticker}', {open}, {high}, {low}, {close})
         ON CONFLICT (trade_date, ticker) DO UPDATE 
         SET  
           high = case when {TABLE_NAME}.high < excluded.high then excluded.high 
               when {TABLE_NAME}.high >= excluded.high then {TABLE_NAME}.high end,
           low = case when {TABLE_NAME}.low > excluded.low then excluded.low 
               when {TABLE_NAME}.low <= excluded.low then {TABLE_NAME}.low end,
           close = {close};""".format(**format_data)

如此啰嗦,因为暂时不会PG的IF函数……
 

还有类似于接入实时行情截面(快照)数据的需求,也可以用这个功能。

大概是这样,没测试,盲写的,见谅。

INSERT INTO t_quote (col_1, col_2) values ('601318.SH', 86.24), ('600519.SH', 1988.30) 

ON DUPLICATE KEY UPDATE col_1 = values(col_1), col_2 = valeus(col_2);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qcyfred

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值