zoukankan      html  css  js  c++  java
  • 2020系统综合实践 第5次实践作业

    构建所需的镜像

    • 参考博客:
    • 首先我们要准备所需要的python镜像,因为用到了数据库操作和opencv,所以需要安装一些额外的库,dockerfile中的指令里我使用了临时换源的方法,因为我尝试了直接更换容器内的pip配置,但是没什么效果,在指令里直接加入国内源也可以起到换源下载的效果。
    //Dockerfile
    #基础镜像
    FROM python
    
    #默认工作目录
    WORKDIR /usr/local/pyfile
    
    #安装所需要的库,后面-i 就是换成国内的源去安装所需要的库,因为一开始我试了换pip的配置文件,但是没什么效果,所以就在安装的指令里临时这样用。
    RUN pip install PyMySQL -i https://pypi.tuna.tsinghua.edu.cn/simple && pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    • 这样,所需要的基本镜像准备完毕,接下来就可以一项一项编写程序测试了。

    程序部署

    • 参考资料老师在作业发布界面给出的链接。

    • 首先需要跑起来一个mysql的容器,以方便测试,可以使用之前实验中的容器。

    • 接下来运行一个刚才定制的python容器,并且进入交互模式。

    • 具体参数可参考该资料------Docker run 命令

    #--link是连接容器,-v是挂载,-it是交互使用
    sudo docker run -it -v /home/hhn/homework5/pyfile:/usr/local/pyfile --link=mymysql:mymysql -d mypython
    
    • 用ls命令可以看到容器内当前目录下已经有我们需要的全部py程序,可以开始测试。

    helloworld

    • 这是最基本的一个程序,基本上是每个学习python的人完成的第一个程序,代码也只有短短一行。
    print("Hello World")
    

    日历

    • 这是一个交互式的程序,输入年份和月份后会返回当前月份的日历。
    import calendar
     
    yy = int(input("输入年份: "))
    mm = int(input("输入月份: "))
    
    print(calendar.month(yy,mm))
    

    数据库操作

    • 整个过程是创建一个STUDENT表,然后插入数据,进行查询,之后进行修改数据和删除数据,再进行查询。连接的时候host值填数据库容器的名称,我填localhost无法连接,会出现错误。
    import pymysql
     
    # 打开数据库连接
    db = pymysql.connect(host="mymysql",user="root",passwd="123456",db="docker_mysql",port=3306)
     
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
     
    # 使用 execute()  方法执行 SQL 查询 
    cursor.execute("SELECT VERSION()")
     
    # 使用 fetchone() 方法获取单条数据.
    data = cursor.fetchone()
     
    print ("Database version : %s " % data)
    
    
    # 使用 execute() 方法执行 SQL,如果表存在则删除
    cursor.execute("DROP TABLE IF EXISTS STUDENT")
    
    # 使用预处理语句创建表
    sql = """CREATE TABLE STUDENT (
             ID CHAR(20) NOT NULL,
             NAME CHAR(20) NOT NULL,
             AGE INT,
             SEX CHAR(10),
             MAJOR CHAR(30) )"""
    
    cursor.execute(sql)
    
    # SQL 插入语句
    sql = """INSERT INTO STUDENT(ID,
             NAME, AGE, SEX, MAJOR)
             VALUES ('111700312', 'hhn', 20, 'Male', 'computer science')"""
    try:
       # 执行sql语句
       cursor.execute(sql)
       # 提交到数据库执行
       db.commit()
    except:
       # 如果发生错误则回滚
       db.rollback()
    
    sql = """INSERT INTO STUDENT(ID,
             NAME, AGE, SEX, MAJOR)
             VALUES ('123456789', 'test', 18, 'Female', 'English')"""
    try:
       # 执行sql语句
       cursor.execute(sql)
       # 提交到数据库执行
       db.commit()
    except:
       # 如果发生错误则回滚
       db.rollback()
    
    # SQL 查询语句
    sql = "SELECT * FROM STUDENT 
           WHERE AGE >= 18"
    try:
       # 执行SQL语句
       cursor.execute(sql)
       # 获取所有记录列表
       results = cursor.fetchall()
       for row in results:
          ID = row[0]
          NAME = row[1]
          AGE = row[2]
          SEX = row[3]
          MAJOR = row[4]
           # 打印结果
          print ("id=%s,name=%s,age=%s,sex=%s,major=%s" % 
                 (ID, NAME, AGE, SEX, MAJOR ))
    except:
       print ("Error: unable to fetch data")
    
    # SQL 更新语句
    sql = "UPDATE STUDENT SET AGE = AGE + 1 WHERE SEX = '%s'" % ('Male')
    try:
       # 执行SQL语句
       cursor.execute(sql)
       # 提交到数据库执行
       db.commit()
    except:
       # 发生错误时回滚
       db.rollback()
    
    # SQL 查询语句
    sql = "SELECT * FROM STUDENT 
           WHERE AGE >= 18"
    try:
       # 执行SQL语句
       cursor.execute(sql)
       # 获取所有记录列表
       results = cursor.fetchall()
       for row in results:
          ID = row[0]
          NAME = row[1]
          AGE = row[2]
          SEX = row[3]
          MAJOR = row[4]
           # 打印结果
          print ("id=%s,name=%s,age=%s,sex=%s,major=%s" % 
                 (ID, NAME, AGE, SEX, MAJOR ))
    except:
       print ("Error: unable to fetch data")
    
    
    
    
    # SQL 删除语句
    sql = "DELETE FROM STUDENT WHERE AGE >= %s" % (20)
    try:
       # 执行SQL语句
       cursor.execute(sql)
       # 提交修改
       db.commit()
    except:
       # 发生错误时回滚
       db.rollback()
    
    # SQL 查询语句
    sql = "SELECT * FROM STUDENT 
           WHERE AGE >= 18"
    try:
       # 执行SQL语句
       cursor.execute(sql)
       # 获取所有记录列表
       results = cursor.fetchall()
       for row in results:
          ID = row[0]
          NAME = row[1]
          AGE = row[2]
          SEX = row[3]
          MAJOR = row[4]
           # 打印结果
          print ("id=%s,name=%s,age=%s,sex=%s,major=%s" % 
                 (ID, NAME, AGE, SEX, MAJOR ))
    except:
       print ("Error: unable to fetch data")
    
    # 关闭数据库连接
    db.close()
    

    • 进入数据库的容器确认,如图,和预期结果相符,容器内有STUDENT表,并且最后只剩下一条数据。

    opencv操作

    • 参考资料------(Canny边缘检测)[https://www.cnblogs.com/aoru45/p/9763988.html]
    • 这个我选的操作是边缘检测,刚好大数据学习过相关的内容,就试一试效果,python程序很简单,就是调一个库就可以了,但是背后实现并不简单。
    import cv2
    
    img = cv2.imread('test.jpg',0)
    #Canny的后两个参数可以根据图片自己调
    edges = cv2.Canny(img,50,100)
    
    cv2.imwrite('after.jpg',edges)
    

    • 这是我选择的原图。

    • 这是处理后的效果图,效果我觉得还是很不错的。

    • 最后本次实验的文件结构

    问题&解决方法

    • Q:运行日历程序calendar.py程序报错。
      • A:python库中有calendar的库,如果你自己的程序还是这样命名会冲突,所以换个名字就可以。
    • Q:python的容器无法连接上数据库,显示Can't connect to MySQL server on 'localhost' ([Errno 99] Cannot assign requested address)
      • A:run中的link参数已经把两个容器链接在一起,在操作数据库的python文件中连接操作时host使用localhost时一直连接不上时,可以试试换成数据库容器的名字,我是换成数据库容器的名字后就连接上了。

    时间

    实验+写博客约三小时。

    小结

    这个实验差不多算是做的最快的一个,因为有了前几次的经验,有些错误就可以很快地找到解决方法。而且现在下载软件我的第一反应不是怎么下载,而是如何去换源,换源后的速度真是起飞。而且这次实验用的python是我之前学习过的,所以也比较熟悉,总之,这是一次愉快的实验。

  • 相关阅读:
    移动端h5实现拍照上传图片并预览&webuploader
    移动端实现上拉加载更多(使用dropload.js vs js)
    实用的移动端日历选择插件
    string.replace替换
    js与native的交互
    div实现返回符,倒三角,椭圆+小知识收集
    js返回一组日期中最近连续的天数
    javascript 事件冒泡和事件代理
    微信小程序DEMO——面包旅行的代码
    微信小程序使用 iconfont
  • 原文地址:https://www.cnblogs.com/ambition-hhn/p/12907530.html
Copyright © 2011-2022 走看看