访问数据库
import sqlite3
# 连接一个数据库,要是没有就会自己创建一个
conn = sqlite3.connect("MySQL.db")
# 创建一个游标,用于执行SQL语句
cursor = conn.cursor()
## 创建表 创建表的一般结构就是:create table <表名> (<属性名字 类型>,......);
# 或者也可以把要执行的语句先写出来,再传给execute()方法。
cursor.execute("create table stu(name varchar(20) primary key,age int(8),sex varchar(20))")
print("表已经创建完成")
## 增 向表中插入数据的结构是: :insert into <表名> ( <属性名字>,......) values ( 值 1 ,值2,......)值记得带引号。
# 同样也可以先把值给写出来,再传给execute方法。中间要写属性的括号可以不写,写了更清楚一些。
# cursor.execute("insert into stu (name ,age ,sex) values ('li' , 22 ,'male')")
value = "insert into stu (name ,age ,sex) values ('li',22,'male')"
cursor.execute(value)
# 插入多行的数据,可以使用executemany()这个方法,不过需要传入两个参数,一个是插入语句,一个是值的列表
list_students_values = [('wang',19,'female'),
('zhang',21,'female'),
('he',20,'female')]
sql_insert = "insert into stu (name,age,sex) values (?,?,?)"
cursor.executemany(sql_insert,list_students_values)
# 改 更新数据库信息:update 数据表 set 属性名 = 值 where 条件表达式
# 先更改一行的数据
sql_update = "update stu set age = 23 where name = 'wang'"
cursor.execute(sql_update)
# 同样可以更改多行的数据,记住一个通配符'?'。用于匹配的,注意要有括号。
cursor.executemany("update stu set age=? where name=? ",
(
(20,'zhang'),
(20,'he')#把zhang,he的年纪改为20
))
# 更改之后提交事务,用连接提交事务
conn.commit()
# 可以通过rowcount来查看修改了几条数据
print("所以修改了%s条数据"%cursor.rowcount)
## 查
# sqlite_master是sqlite数据库内置的一个表,由系统写入,自己不能写入,而且是只读的一个表,当删除数据库里面所有表的时候,这个表也就不存在了。
# 里面记录的你自己创建的表的信息,通过这个语句可以查看到这个表,是一个列表,里面每个表的信息作一个元组
# 每个元组存放一个表的信息,这个元组有五个元素,是表的类型table,名字,表的名字,索引和创建这个表的sql语句
# cursor.execute("select * from sqlite_mater")
# print(cursor.fetchall())
# pragma语句可以查看表的信息,用来查看表的属性,而用select语句可以查看表里面值的信息
# cursor.execute("pragma table_info('sqlite_mater')")
# print(cursor.fetchall())
# 查询表的信息数据语句是:select * from table_name where 条件语句
cursor.execute("select * from stu")
print(cursor.fetchall())
# 删除表,直接使用drop tabel + 表的名字就可以删除掉这个表了
# cursor.execute("drop table user")
# 最后记得关闭游标和连接,先关游标,再断开连接
cursor.close()
conn.close()
使用SQLAlchemy库以及ORM框架
ORM(Object Rational Mapping对象关系映射)
将python中的对象和关系数据库MySQL进行映射,这样就不需要操作复杂的SQL语句了。
说白了就是将SQL语句转换成python语句
无非就是将MySQL的操作给映射成对象,就可以这样理解,如果我们像操作MySQL或者SQLite那样写一句sql语言,然后交给execute去操作,这种由人自己写的难免会出现错误,所以使用sqlchemy库,将这些东西都映射成对象,不容易出错。
其实sqlchemy对本地数据库MySQL操作还需要借助MySQL来进行连接,这就是create_engine函数的作用,创建连接,连接到之后无非也就是对数据库进行增删改查的操作,具体的可以见ORM.py那个文件,里面也有注释。
Web开发
HTTP协议简介
当我们点击F12进入网页开发者模式:Elements显示网页结构;Networks显示浏览器和服务器的通信。
HTML负责定义页面的内容;CSS负责控制页面元素样式;JS负责页面的逻辑交互。
WSGI接口
WSGI服务网关接口,是web服务器和web应用程序或框架之间的一种接口。(所以一直就搞错了,之前的理解是WSGI接口是在客户端与服务器端的接口,一直把应用程序当成客户端,其实不是这样的,WSGI都是属于服务器端的东西)
所以一个正常的服务器端,有两个部分:一部分是web应用就是框架,理解起来比较抽象,就是用于保存html文件的;一部分是服务器用来接收到浏览器发送的http请求然后解析然后从application里面获取到html文件然后发送响应。
所以有个这个WSGI协议规范,我们就可以专注于写自己的Application的东西就是HTML这些,而且可以兼容广泛的服务器。
WSGI协议规定,Application只要符合接收俩服务器的参数envir和start_response就可以使用这个服务器。
所以在Application我们只负责写什么东西给服务器然后由服务器发送给客户端,即浏览器。
envir:一个包含所有http请求信息的字典对象;
start_response:一个发送http响应的函数,一般作为响应头发送;
一般从envir里面获取到请求信息,start_response()函数接收两个参数,一个是HTTP响应码,一个是一组list表示的HTTP Header,每个Header用一个包含两个str的tuple表示。
Application函数写完之后,由服务器来调用这个函数,所有符合WSGI规范的服务器都可以调用这个函数。
python内置的wsgiref模块就相当于一个小型的服务器负责接收解析http请求和发送http响应,并且可以调用application。
这里提一下这个environ这个对象里面的['PATH_INFO'][1:]这个返回的就是你在浏览器输入的网址url
再来说明一下过程,由WSGI—Server服务器调用Application里面的函数,获取到需要发送给客户端即浏览器的信息。
WSGI-Servser服务器端
Application端
其实这样一看WSGI接口实际上非常简单。
框架的使用
flask框架的使用让我们不用管environ传来的url进行处理,我们只需要专注于一个url对应什么函数处理。
可以先看一下前面有装饰器,就说明这个url对应下面的这个函数进行处理。