這種數據被稱爲時間系列。對於時間序列,有專門的數據庫引擎,但是具有非極端數量的觀測數據(時間戳,波高,風,潮,這是破壞它的元組) - 一個SQL數據庫將會非常好。
嘗試在Postgres或MySQL中將數據建模爲表格。首先製作一個表格並手動在數據庫的GUI客戶端中插入一些假數據。當它看起來正確時,你有架構。相應的CREATE TABLE語句是您的DDL。您應該能夠對您的表編寫SELECT查詢,以產生您想要在Web應用程序上顯示的數據。如果這些查詢很尷尬,則表示您的模式需要修訂。保存你的DDL。它是(某種)你的源代碼的一部分。我想象兩張桌子:衝浪休息的列表,以及觀察列表。觀察列表中的每一行都會引用衝浪休息的列表。如果你使用的是Mac,Sequel Pro
是一款適合使用MySQL數據庫的體面工具,並且玩耍可能是學習使用它的最佳方式。
接下來,嘗試從Python腳本向表中插入數據。從假數據開始就沒有問題,但是模擬你的Python腳本來從你的上游源讀取(刮取的結果)並插入到表中。你的刮碼輸出是什麼?這是一個你可以打電話的功能嗎?您可以閱讀的CSV?這將決定這個腳本的工作方式。
如果這個導入腳本是idempotent它會有所幫助:你可以多次運行它,並且不會因插入重複行而造成混亂。如果這是遞增,它也會有所幫助:一旦數據集變大,重新計算整個事情將會非常昂貴。嘗試處理一次導入特定的時間間隔。命令行工具很好。您可以將間隔指定爲命令行參數,或從當前時間中指出。從一個系統
這裏的一般問題,將數據加載到另一個上定期,被稱爲ETL。你有一個非常簡單的例子,可以使用非常簡單的工具,但如果你想了解它,那就是它的名字。相反,如果您可以獲得連續的觀測數據 - 比如直接來自傳感器 - 您將會有一個流式攝入問題問題。
您可以使用Linux子系統cron
使該腳本按計劃運行。你會想知道它是否成功運行 - 這會打開一整套關於監視和警報的蠕蟲。有各種開源系統可以讓你從程序中發佈指標,基本上是「嘿,這發生了」滴答聲,看到這些指標繪製在圖表上,並要求通過電子郵件發送/發短信/分頁,如果出現頻繁發生或很少。 (順便說一句,這些系統是時間序列數據庫的主要應用之一)。不要陷入這種前沿,但要牢記在心。 Statsd,Grafana和Prometheus是一些讓你開始在這個方向上搜索的名字。您也可以簡單地讓腳本發送成功或失敗的電子郵件,但人們往往開始忽略此類電子郵件。
您將編寫一些函數與數據庫引擎進行交互。在Python模塊中提取它們。這構成了您的數據訪問層的基礎。在Flask應用程序中重用它。如果你將所有這些東西保存在同一個Git倉庫中,這將是最簡單的。您可以直接使用您選擇的數據庫引擎的Python客戶端,也可以使用SQLAlchemy之類的抽象層。這個決定是有爭議的,人們會有意見,但只選一個。無論您選擇哪種數據庫API,請了解SQL注入攻擊是什麼以及如何在查詢中使用用戶提供的數據,而無需打開自己的SQL注入。你的數據庫API的文檔應該涵蓋後者。
Flask應用程序的/
頁面將基於SQL查詢,如SELECT * FROM surf_breaks
。呈現每個鏈接到特定於中斷的頁面。
您將會擁有另一個頁面,如/breaks/n
,其中n
標識了一個衝浪休息時間(一個隨着插入衝浪休息行而增加的整數是慣用的)。本頁面將基於SELECT * FROM observations WHERE surf_break_id = n
這樣的查詢。在每種情況下,您都會在數據訪問層調用函數來獲取行列表,然後在模板中遍歷這些行並呈現一些HTML。有各種Javascript和Python圖形庫,您可以將這些行列表提供給客戶端或服務器端,並從中獲取圖形。如果您對像周而復始的更改感興趣,則應該能夠在一個SQL查詢中表達這一點,並直接從數據庫引擎中獲取該數據集。
爲了提高性能,請儘量避免在頁面加載期間發生多個SQL查詢的情況。默認情況下,您將回到數據庫並在每次有人請求時重新計算頁面,從而做一些不必要的工作。如果這成爲問題,您可以在Flask應用程序前添加一個反向代理緩存。在你的情況下,這很容易,因爲沒有用戶對應用程序做任何事情導致其內容改變。導入新數據時只需使緩存無效。
這是一個經過深思熟慮,全面且令人驚歎的答案。謝謝你closeparen。 –