烧瓶网站后端结构指导协助



我有一个基本的个人项目网站,我希望学习一些Web开发基础知识和数据库(SQL)基础知识(如果SQL甚至是正确的技术使用??)。

我已经启动并运行了基本的骨架,但由于我是新手,我想确保我以最有效和"正确"的方式做到这一点。

目前,该网站有一个主索引(登陆)页面,用户可以从那里选择几个子页面之一。为了便于理解,这些子页面中的每一个都代表不同的冲浪休息,它们都显示有关该特定休息的相关信息,即波高、风、潮汐。

由于我已经能够成功抓取这些数据,我的主要问题围绕着如何将这些数据插入数据库以供将来使用(历史图表、趋势)?如何确保以连续的方式(一次/天)将数据添加到此数据库?我将如何使用从较早时间(例如中午)抓取的数据在下午 12:05 显示/使用,而不是再次抓取?

非常感谢您可以指出我的任何其他提示、指导或资源。

这种数据称为时间序列。有专门的时间序列数据库引擎,但对于非极端的观测量 - (时间戳,波高,风,潮汐,打破它)元组 - SQL数据库将完全没问题。

尝试在Postgres或MySQL中将数据建模为表。首先创建一个表,并在数据库的 GUI 客户端中手动插入一些假数据。当它看起来正确时,您就有了您的架构。相应的 CREATE TABLE 语句就是您的 DDL。您应该能够针对表编写 SELECT 查询,以生成要在 Web 应用程序上显示的数据。如果这些查询很尴尬,则表明您的架构需要修改。保存您的 DDL。它是源代码的一部分。我想象两个表格:冲浪休息列表和观察结果列表。观测值清单中的每一行都将引用冲浪休息点清单。如果你在Mac上,Sequel Pro是玩MySQL数据库的不错工具,而玩转可能是学习使用它的最佳方式。

接下来,尝试从 Python 脚本将数据插入表中。从假数据开始很好,但要塑造你的 Python 脚本,从上游源读取(抓取的结果)并插入到表中。您的抓取代码输出什么?它是您可以调用的函数吗?您可以阅读的 CSV 文件?这将决定此脚本的工作方式。

如果此导入脚本是幂等的,这将有所帮助:您可以多次运行它,并且不会通过插入重复的行来弄乱它。如果这是增量的,也会有所帮助:一旦你的数据集变大,重新计算整个东西将非常昂贵。尝试一次处理导入特定间隔。命令行工具很好。您可以将间隔指定为命令行参数,也可以从当前时间中找出来。

这里的一般问题,定期将数据从一个系统加载到另一个系统,称为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 应用前面添加反向代理缓存。在您的情况下,这很容易,因为用户对应用程序执行的任何操作都不会导致其内容更改。只需在导入新数据时使缓存失效即可。

最新更新