创建之后,逐步添加表之间的关系以及部分限制条件:
?复制代码
ALTER TABLE `photo_tags` ADD CONSTRAINT `photo_tags_tags_alter` FOREIGN KEY (`tag`) REFERENCES `tags`(`tid`) ON DELETE CASCADE ON UPDATE RESTRICT; ALTER TABLE `photo_tags` ADD CONSTRAINT `photo_tags_photo_alter` FOREIGN KEY (`photo`) REFERENCES `photo`(`pid`) ON DELETE CASCADE ON UPDATE RESTRICT;ALTER TABLE `photo` ADD CONSTRAINT `photo_category_alter` FOREIGN KEY (`category`) REFERENCES `category`(`cid`) ON DELETE CASCADE ON UPDATE RESTRICT;ALTER TABLE `photo` ADD CONSTRAINT `photo_user_alter` FOREIGN KEY (`user`) REFERENCES `users`(`uid`) ON DELETE CASCADE ON UPDATE RESTRICT;ALTER TABLE `category` ADD CONSTRAINT `category_user_alter` FOREIGN KEY (`user`) REFERENCES `users`(`uid`) ON DELETE CASCADE ON UPDATE RESTRICT;ALTER TABLE `tags` ADD unique(`name`); 函数功能开发接下来,开始写第一个函数——注册登录函数 。因为这是一个小程序,所以注册登录实际上就是拿着用户的 openId 去数据库查查有没有信息,有信息的话,就执行登录,没有信息的话就 insert 一下 。那么问题来了,如何连接数据库?之所以有这样的问题,是源自两个因素:
- 我们平时做项目的时候,并不是每次请求都连接一次数据库,很多时候,数据库的连接是可以保持下来的,但是在 Serverless 架构下可以实现吗?或者我们需要去哪里连接数据库呢?
- 传统项目,我们做数据库连接只用一个方法就可以搞定,但是函数中,每个函数都是单独存在的,是否每个函数都要连接一下数据库?

文章插图
创建之后,疯狂点击测试按钮,多次记录运行日志:
第一次
?复制代码
START RequestId: 4facbf59-3787-11ea-8026-52540029942f Event RequestId: 4facbf59-3787-11ea-8026-52540029942f 11111111 222222222END RequestId: 4facbf59-3787-11ea-8026-52540029942f Report RequestId: 4facbf59-3787-11ea-8026-52540029942f Duration:1ms Memory:128MB MaxMemoryUsed:27.3164MB第二次?复制代码
START RequestId: 7aaf7921-3787-11ea-aba7-525400e4521d Event RequestId: 7aaf7921-3787-11ea-aba7-525400e4521d 222222222END RequestId: 7aaf7921-3787-11ea-aba7-525400e4521d Report RequestId: 7aaf7921-3787-11ea-aba7-525400e4521d Duration:1ms Memory:128MB MaxMemoryUsed:27.1953MB第三次?复制代码
START RequestId: 742be57a-3787-11ea-b5c5-52540047de0f Event RequestId: 742be57a-3787-11ea-b5c5-52540047de0f 222222222END RequestId: 742be57a-3787-11ea-b5c5-52540047de0f Report RequestId: 742be57a-3787-11ea-b5c5-52540047de0f Duration:1ms Memory:128MB MaxMemoryUsed:27.1953MB第四次?复制代码
START RequestId: 6faf934b-3787-11ea-8026-52540029942f Event RequestId: 6faf934b-3787-11ea-8026-52540029942f 222222222END RequestId: 6faf934b-3787-11ea-8026-52540029942f Report RequestId: 6faf934b-3787-11ea-8026-52540029942f Duration:1ms Memory:128MB MaxMemoryUsed:27.1953MB大家仔细观察,发现了什么?我在函数外侧写的print("11111111")实际上只出现了一次,也就是说只运行了一次,而函数内的print("222222222")则是出现了多次,确切来说是每次都会出现,函数在创建的时候,会让我们写一个执行方法,例如index.main_handler,就是说默认的入口文件就是index.py下的main_handler方法 。通过刚才的小实验,是不是可以认为,云函数实际上是随着机器或者容器启动同时启动了一个进程(这个时候会走一次外围的一些代码逻辑),然后当函数执行的时候,会走我们指定的方法,当函数执行完,这个容器并不会被马上销毁,而是进入销毁的倒计时,这个时候如果有请求来了,那么很可能复用这个容器,此时就没有容器启动的说法,会直接执行我们的方法 。按照这个逻辑,是不是我们的函数,如果要在我们的方法之外,初始化数据库就可以保证尽可能少的数据库连接建立,而满足更多的请求呢?换句话说,是不是和容器复用类似,我们就可以复用数据库的连接了?
所以,我们可以尝试这样写整个代码(login 为例)
?复制代码
# -*- coding: utf8 -*- import osimport pymysqlimport json connection = pymysql.connect(host=os.environ.get('mysql_host'),user="root",password=os.environ.get('mysql_password'),port=int(62580),db="mini_album",charset='utf8',cursorclass=pymysql.cursors.DictCursor,autocommit=1) def getUserInfor(connection, wecaht):try:connection.ping(reconnect=True)cursor = connection.cursor()search_stmt = ("SELECT * FROM `users` WHERE `wechat`=%s")data = https://www.isolves.com/it/ai/2020-07-24/(wecaht)cursor.execute(search_stmt, data)cursor.close()result = cursor.fetchall()return len(result)except Exception as e:print("getUserInfor", e)try:cursor.close()except:passreturn False def addUseerInfor(connection, wecaht, nickname, remark):try:connection.ping(reconnect=True)cursor = connection.cursor()insert_stmt = ("INSERT INTO users(wechat,nickname,remark) ""VALUES (%s,%s,%s)")data = (wecaht, nickname, remark)cursor.execute(insert_stmt, data)cursor.close()connection.close()return Trueexcept Exception as e:print(e)try:cursor.close()except:passreturn Falsedef main_handler(event, context):print(event)body = json.loads(event['body'])wecaht = body['wechat']nickname = body['nickname']remark = str(body['remark'])if getUserInfor(connection, wecaht) == 0:if addUseerInfor(connection, wecaht, nickname, remark):result = Trueelse:result = Falseelse:result = Truereturn {"result": result}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 基于Bert和通用句子编码的Spark-NLP文本分类
- eHIDS 一款基于eBPF的HIDS开源工具
- 基于零信任的安全架构
- 教你编译一个基于arm的Linux内核,并用qemu模拟器测试
- 基于机器学习的自适应码率算法的进一步探索与改进
- 基于Modbus协议实现Openplc与Kingview的仿真通讯与模拟测试
- 基于oAuth的授权登陆
- 附代码 基于NLP的COVID-19虚假新闻检测
- 如何基于TCP/IP协议进行MFC Socket网络通讯编程
- 内网渗透基础——命令行下安装Microsoft .NET Framework
