Я провел последние несколько дней, изучая node.js и pg-обещание, и я пытаюсь оптимизировать мой код, чтобы он был максимально эффективным и быстрым.Я не уверен, правильно ли я использую pg-обещание, но я просматривал эти посты и руководства.
Вложенные запросы с обещаниями pg
получить таблицу JOIN как массив результатов с PostgreSQL / NodeJS
Объединить запросы вложенного цикла с результатом родительского массива - pg-обещание
Импорт данных
выберите => вставить
Хорошо, все это сказано.Проблема, с которой я сталкиваюсь сейчас, состоит в том, что оператор UPDATE не запускается правильно, и я вполне уверен, что это потому, что поле даты неверно.Я не уверен, как передать это в правильную дату прямо сейчас.Функция tulind возвращает массив значений в том же порядке и считается, как было введено.Мне нужно обновить таблицу с этими значениями, указав индекс на основе тикера + дата.
Мое идеальное состояние - использовать стратегию «массового вставления» из ссылки Импорт данных НоЯ не совсем уверен, как реализовать это, прежде чем решить эту проблему с датой.
В любом случае, заранее благодарю вас за любую помощь и дайте мне знать, какие другие детали я могу предоставить, чтобы помочь!
var tulind = require('tulind')
const argv = require('yargs').argv
let run_date = argv.t
const db = require('./pg_db.js')
//step 1: get list of tickers
//step 2: get the past 100 days of close_price to fed into tulind
//step 2: generate TI values from tulind
//step 3: update values back into postgres
db.tx(t => {
//select all eligible stocks that need to have their SMA10 value updated, could be 6k+ records.
return t.many(`select ticker from stocks.stock_md where date(last_sma10) <= date('${run_date}') or last_sma10 is null limit 1`)
.then(ticker_list => {
//console.log(ticker_list)
//select 100 past data points to feed into the tulind function for each individual stock ticker
return t.many(`select ticker, date, close_price from stocks.all_stocks where ticker='${ticker_list[0].ticker}' order by date desc limit 50`)
.then(eod_data => {
let cprice = eod_data.map(item => item.close_price)
//calculate the 10 day SMA for all stocks and update stock.all_stocks
//tulind will return an array of values for as many data points as is fed into the function
tulind.indicators.sma.indicator([cprice],[10], function(err, sma10_results) {
//eod_data.push("sma10: ", sma10_results) //this definitely doesn't work
const queries = eod_data.map(d=>t.none(`UPDATE stocks.all_stocks SET sma10='$4' WHERE ticker='$1' AND date='$2'`, eod_data))
//console.log(eod_data)
})
})
.catch(error => {
console.log(error)
})
return t.batch(queries);
})
.catch(error => {
console.log(error)
})
})
.then(data => {
// SUCCESS
})
.catch(error => {
// ERROR
})
<table border="1"><tbody><tr><th>ticker</th><th>open_price</th><th>close_price</th><th>date</th><th>SMA5</th><th>sma10</th><th>volume</th><th>signal</th><th>high</th><th>low</th><th>macd12</th><th>macd_signal9</th><th>macd26</th><th>obv</th><th>rsi7</th><th>rsi14</th></tr><tr><td>SEB</td><td>200.0000</td><td>200.0000</td><td>2000-01-03</td><td> </td><td> </td><td>500</td><td> </td><td>200.0000</td><td>200.0000</td><td> </td><td> </td><td> </td><td>-173264</td><td> </td><td> </td></tr><tr><td>SEB</td><td>200.0000</td><td>200.0000</td><td>2000-01-04</td><td> </td><td> </td><td>1000</td><td> </td><td>200.0000</td><td>200.0000</td><td> </td><td> </td><td> </td><td>-173264</td><td> </td><td> </td></tr><tr><td>SEB</td><td>201.0000</td><td>199.0000</td><td>2000-01-05</td><td> </td><td> </td><td>300</td><td> </td><td>201.0000</td><td>199.0000</td><td> </td><td> </td><td> </td><td>-174264</td><td> </td><td> </td></tr><tr><td>SEB</td><td>197.0000</td><td>194.0000</td><td>2000-01-06</td><td> </td><td> </td><td>1200</td><td> </td><td>197.1000</td><td>194.0000</td><td> </td><td> </td><td> </td><td>-174564</td><td> </td><td> </td></tr><tr><td>SEB</td><td>194.0000</td><td>194.0000</td><td>2000-01-07</td><td>197.4000000000029</td><td> </td><td>0</td><td> </td><td>194.0000</td><td>194.0000</td><td> </td><td> </td><td> </td><td>-174564</td><td> </td><td> </td></tr><tr><td>SEB</td><td>193.3000</td><td>193.1000</td><td>2000-01-10</td><td>196.0200000000029</td><td> </td><td>300</td><td> </td><td>193.3000</td><td>193.1000</td><td> </td><td> </td><td> </td><td>-174564</td><td> </td><td> </td></tr><tr><td>SEB</td><td>193.0000</td><td>193.0000</td><td>2000-01-11</td><td>194.6200000000029</td><td> </td><td>300</td><td> </td><td>193.0000</td><td>193.0000</td><td> </td><td> </td><td> </td><td>-174864</td><td> </td><td> </td></tr><tr><td>SEB</td><td>193.0000</td><td>191.0000</td><td>2000-01-12</td><td>193.0200000000029</td><td> </td><td>500</td><td> </td><td>193.0000</td><td>188.3000</td><td> </td><td> </td><td> </td><td>-175164</td><td> </td><td> </td></tr><tr><td>SEB</td><td>192.0000</td><td>192.0000</td><td>2000-01-13</td><td>192.6200000000029</td><td> </td><td>500</td><td> </td><td>192.0000</td><td>188.0000</td><td> </td><td> </td><td> </td><td>-174664</td><td> </td><td> </td></tr><tr><td>SEB</td><td>193.0000</td><td>189.0000</td><td>2000-01-14</td><td>191.6200000000029</td><td>194.50999999998996</td><td>600</td><td> </td><td>193.0000</td><td>186.0000</td><td> </td><td> </td><td> </td><td>-175164</td><td> </td><td> </td></tr><tr><td>SEB</td><td>188.0000</td><td>188.0000</td><td>2000-01-18</td><td>190.60000000000292</td><td>193.30999999998994</td><td>100</td><td> </td><td>188.0000</td><td>188.0000</td><td> </td><td> </td><td> </td><td>-175764</td><td> </td><td> </td></tr><tr><td>SEB</td><td>187.0000</td><td>192.0000</td><td>2000-01-19</td><td>190.40000000000293</td><td>192.50999999998996</td><td>300</td><td> </td><td>192.0000</td><td>187.0000</td><td> </td><td> </td><td> </td><td>-175664</td><td> </td><td> </td></tr><tr><td>SEB</td><td>194.0000</td><td>189.0000</td><td>2000-01-20</td><td>190.00000000000293</td><td>191.50999999998996</td><td>1100</td><td> </td><td>200.0000</td><td>185.5000</td><td> </td><td> </td><td> </td><td>-175964</td><td> </td><td> </td></tr><tr><td>SEB</td><td>189.0000</td><td>189.0000</td><td>2000-01-21</td><td>189.40000000000293</td><td>191.00999999998993</td><td>300</td><td> </td><td>189.0000</td><td>185.0000</td><td> </td><td> </td><td> </td><td>-175964</td><td> </td><td> </td></tr><tr><td>SEB</td><td>191.0000</td><td>194.8000</td><td>2000-01-24</td><td>190.5600000000029</td><td>191.0899999999899</td><td>1000</td><td> </td><td>198.0000</td><td>191.0000</td><td> </td><td> </td><td> </td><td>-175664</td><td> </td><td> </td></tr></tbody></table>
CREATE TABLE stocks.stock_md (
ticker varchar NOT NULL,
company_name varchar NULL,
sector varchar NULL,
industry varchar NULL,
daily_update varchar NULL,
last_update date NULL,
exchange varchar NULL,
last_obv date NULL,
last_sma5 date NULL,
last_sma10 date NULL,
last_rsi7 date NULL,
last_rsi14 date NULL
)
CREATE TABLE stocks.all_stocks (
ticker varchar NOT NULL,
open_price varchar NULL,
close_price varchar NULL,
"date" varchar NOT NULL,
"SMA5" varchar NULL,
sma10 varchar NULL,
volume varchar NULL,
signal varchar NULL,
high varchar NULL,
low varchar NULL,
macd12 varchar NULL,
macd_signal9 varchar NULL,
macd26 varchar NULL,
obv varchar NULL,
rsi7 varchar NULL,
rsi14 varchar NULL,
CONSTRAINT all_stocks_pk PRIMARY KEY (ticker, date)
)