Django ORM if you already know SQL

If you are migrating to Django from another MVC framework, chances are you already know SQL.

In this post, I will be illustrating how to use Django ORM by drawing analogies to equivalent SQL statements. Connecting a new topic to your existing knowledge will help you learn to use the ORM faster.

Let us consider a simple base model for a person with attributes name, age, and gender.

t7fs6oc

To implement the above entity, we would model it as a table in SQL.

The same table is modeled in Django as a class which inherits from the base Model class. The ORM creates the equivalent table under the hood.

 

The most used data types are:

SQL Django
INT IntegerField()
VARCHAR(n) CharField(max_length=n)
TEXT TextField()
FLOAT(n) FloatField()
DATE DateField()
TIME TimeField()
DATETIME DateTimeField()

The various queries we can use are:

SELECT Statement

Fetch all rows
SQL:

Django:

Fetch specific columns
SQL:

Django:

etch distinct rows
SQL:

Django:

Fetch specific number of rows
SQL:

Django:

LIMIT AND OFFSET keywords
SQL:

Django:

 

WHERE Clause

Filter by single column
SQL:

Django:

Filter by comparison operators
SQL:

Django:

BETWEEN Clause
SQL:

Django:

LIKE operator
SQL:

Django:

IN operator
SQL:

Django:

 

ANDOR and NOT Operators

SQL:

Django:

SQL:

Django:

SQL:

Django:

 

https://amitness.com/2018/10/django-orm-for-sql-users/

 

 

 

 

 

让我们来做个django小项目之二

上篇内容我们算是来了一个开场,创建了我们的项目,最后把数据库也建立完成了,这篇我们主要完成后台数据入库的部分,根据我们之前的思路,如果已经能实时获得每个站点性能信息了,如果能将每次获得信息插入到数据库中,这个就完成了我们的入库部分,这里说一下我们的数据库操作部分,要操作数据库,首先我们要跟数据库建立连接,然后进行常规的CRUD操作,操作完毕后再关闭数据库连接,这是一个基本流程,所以为了提高数据库的操作速度,我们可以把一些常用的操作封装成一个类,以下是我门数据库操作的类代码:

在这个类中我们先定义了__init__方法,指定了数据库连接,用户,端口,用户等信息,接下来是定义了三个方法,分别是建立数据库连接,获取数据内容、更新数据库及最后关闭数据库连接,正题逻辑就是这样,代码没特别的内容。

有了这个数据库类后,我们就可以用上我们之前的pycurl模块去获取每个站点的数据了,每次获取的数据插入到数据库中,因为可能非常多的站点,所以我们要考虑运行效率,所以我们这里使用并发去检查站点数据,采用ThreadPool线程池去实现,全部代码如下:

以上就是我们全部的代码内容,pycurl部分我们不在多解释,不理解的小伙伴可以参考之前的文章,Dummy就是多进程模块的克隆文件,唯一不同的是,多进程模块使用的是进程,而dummy则使用线程,pool.map类似python的map函数,需要二个参数第一个参数是一个函数名,第二个参数是个迭代对象,在这里迭代对象我们是从数据库中直接获取的,至于数据库的数据从哪里来的呢?当然是用户输入的,那下篇我们实现下前端输入页面,让用户自己可以增加要监控的站点,这篇就到这里,喜欢的小伙伴请帮忙转发哟。

 

 

 

站点性能监控demo

上篇我们简单介绍了pycurl的基本使用,在组后我们留了几个问题需要去解决,因为最终我们要实现的是一个页面版的展示所有站点性能的demo, 那这篇就是正式开始我们这个小项目,废话不多说,首先我们创建我们的项目,在命令行模式下输入:

然后进入web_monitor目录中,创建一个app.

创建完成 后我们的目录结构是这样的:

因为数据要需要入库的,所以第一步先设计我们的表结构,也就是我们的Model文件, 进入到sitemonitor目录下,打开models.py文件,写入:

这个文件我们定义了表结构和字段,按上篇我们获取的内容,我们存储的内容有http_code, dns_time,connect_time, pretransfer_time, starttransfter_time,total_time, speed_downlaod字段,url,port,phone这三个字段是为用户输入表单时准备的,这三个后续会用到的时候再说,这里只需要注意因为获取的数字很多都是小数,所以像dns_time我们使用了models.DecimalField字段类型,这个字段类型有2个参数:

max_digits:数字允许的最大位数

decimal_places:小数的最大位数

其它字段类型解释如下:

models.CharField:字符串字段 ,max_length是必须的参数。

models.SmallIntegerField :   数据库中的字段有:tinyint、smallint、int、bigint.   类似 IntegerField, 不过只允许某个取值范围内的整数。(依赖数据库)

然后保存退出,打开site_monitor/settings.py文件,修改如下行:

加入的行我已加注释,不多解释,接下来我们创建数据库表,运行:

接着运行:

这时候我们的库表结果就建立完成了,那这样前期准备工作就全部完成了,下一篇我们开始写后台实现数据实时插入库。

python+pycurl检查网站性能指标

对于一个网站运维人员来说,一个网站的性能好坏是大家非常关心的内容,我们知道衡量一个网站的好好多方面,但对运维人员来说站点的性能指标是我们比较关注的内容,从用户角度来说,最直观的感受就是用户户输入网址后站点内容打开速度的快慢,那从一个用户发起请求到服务器,然后服务器响应提供给数据给客户端,了解http协议的小伙伴应该知道,这中间要经过多个步骤才能实现,所以说一个站点如果出现访问速度上的问题,要从整条链路上去查原因而不能只看某一方面,访问示意图如下:

client-server-architecture

在这个访问过程中我们会关注以下几个指标:

  • DNS解析所消耗时间
  • 从建立连接到准备传输所消耗的时间
  • 从建立连接到传输开始消耗的时间
  • 传输结束所消耗的总时间
  • 平均下载速度
  • 返回的HTTP状态码

通过对以上几个指标的实时监测,当出现问题时就可以快速分析定位问题, 那如何获得这些数据呢,下面就要用到我们的pycurl了,Pycurl包是一个libcurl的Python接口,它是由C语言编写的,速度非常的快,下面看看我们的具体实现:

 

脚本里我只获取了一些比较核心的指标,当然pycurl功能不止这些,如果需要它还可以获取更细致的指标,例如:平均上传速度,HTTP头部大小等。有需要的小伙伴可以自己再研究下,脚本不做多解释了,关键行我加了注释, 最终获取的数据写入到了文本里,可以定时执行这个脚本来实时获取最新数据,这个脚本对要求不高的场景使用没啥问题,但对我们自动化运维来说只迈出了第一步而已,因为最好的方式是通过一个web页面去实时展示各个站点的情况,便于只观的观看,那要实现一个基本的站点,有几个问题我们需要我们思考去解决:

  1. 获取的数据要保存下来,就是有一个入库操作
  2. 随着站点的增加,后台运行,为效率考虑必须要用并发执行
  3. 前台方面:入库的数据要在前台展示,就需要用ajax
  4. 前台展示的页面要能主动自动刷新
  5. 前台入口需要提供一个用户添加url地址的表单
  6. 当然为好看,我们也要使用boostrap等类似的前端框架。

做完这些才算是基本完成我们最终的目标,在后续的文章里我们会逐一完成上面任务,喜欢的小伙伴还请转发,谢谢。

pip安装pycurl报错解决

 

错误1:Command “python setup.py egg_info” failed with error code 1 in /tmp/pip-install-u_NBeS/pycurl/

解决:

pip install –upgrade

pip install pycurl==7.43.0

 

错误2:运行时报错: