【项目实训】个人开发记录博客

这篇博客详细记录了使用Django操作MySQL数据库,包括文件的存储和读取,以及如何在非Django环境下使用PyMySQL进行文件存取操作。内容涉及TensorDataset、DataLoader、模型加载、数据库配置、原始SQL操作和文件字节流处理等技术。
摘要由CSDN通过智能技术生成

神经网络模型以及数据问题

dataset和label可以用TensorDataset来转换为一个可以放入DataLoader的类
在这里插入图片描述

permute维度换位,为了适配网络参数输入顺序
在这里插入图片描述

解决问题,之前一直用的是torch.Tensor,现在知道tensor也要分类型了,一般图像的数据使用FloatTensor,标签使用LongTensor,这样就不会在计算loss的时候报数据类型的错误了
在这里插入图片描述

模型和数据都跑通了,那么接下来的任务就是像mnist那样对数据集进行分割了

参考对mnist数据集分割的代码:

def getDataSetAllocation(dataset_num=200,index=0):
    mnistDataSet = GetDataSet('mnist', True)

    # 测试集
    test_data = torch.tensor(mnistDataSet.test_data)
    test_label = torch.argmax(torch.tensor(mnistDataSet.test_label), dim=1)
    test_dataset = TensorDataset(test_data, test_label)

    # 训练集
    train_data = mnistDataSet.train_data
    train_label = mnistDataSet.train_label

    # 将训练集大小分割为客户端数量
    shard_size = mnistDataSet.train_data_size // dataset_num // 2
    shards_id = np.random.permutation(mnistDataSet.train_data_size // shard_size)

    shards_id1 = shards_id[index * 2]
    shards_id2 = shards_id[index * 2 + 1]
    data_shards1 = train_data[shards_id1 * shard_size: shards_id1 * shard_size + shard_size]
    data_shards2 = train_data[shards_id2 * shard_size: shards_id2 * shard_size + shard_size]
    label_shards1 = train_label[shards_id1 * shard_size: shards_id1 * shard_size + shard_size]
    label_shards2 = train_label[shards_id2 * shard_size: shards_id2 * shard_size + shard_size]
    local_data, local_label = np.vstack((data_shards1, data_shards2)), np.vstack((label_shards1, label_shards2))
    local_label = np.argmax(local_label, axis=1)
    train_dataset = TensorDataset(torch.tensor(local_data), torch.tensor(local_label))

    # 返回类型均为TensorDataset类型,还需要进一步封装入DataLoader
    return train_dataset,test_dataset

从model中加载参数

model.load_state_dict(torch.load(model_file_name, map_location=cuda_name))

django与mysql操作

数据库配置

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test1', #数据库名称
        'USER': 'user1', 
        'PASSWORD': 'chy352196487!',
        'HOST': 'rm-bp1ocx5t725vc9t85fo.mysql.rds.aliyuncs.com',#数据库地址
        'POST': 3306
    }
}

接下来是项目目录下的init.py

import pymysql
pymysql.install_as_MySQLdb()

接着把数据库里的表映射到models里面在这里插入图片描述

python manage.py inspectdb>app_name/models.py

文件操作与bytes数据处理

strb = ''
strb = strb.encode()
with open("img/img1.jpg", "rb") as f:
    # 循环读取一张图片,一次性读取1024个字节
    while True:
        strb += f.read(1024)
        if strb == b"":
            break

接下来尝试使用django往binaryfiled字段存入文件
在这里插入图片描述

insert函数

修改原本已经测试 成功的insert函数 尝试访问地址

def insert(request):
    # 随机整数 作为学号
    # for i in range(0, 5):
    #     # 从models文件中获取student对象
    #     hello = Hello()
    #     # 给对象赋值
    #     hello.asd = str(i)
    #     hello.dsa = str(i)
    #     # 插入数据
    #     hello.save()
    strb = ''
    strb = strb.encode()
    with open("img/img1.jpg", "rb") as f:
        # 循环读取一张图片,一次性读取1024个字节
        while True:
            a = f.read(1024)
            strb += a
            if a == b"":
                break
    fileTest = Filetest()
    fileTest.file1 = strb
    fileTest.save()

    return HttpResponse('数据插入完毕')

结果报了一个文件找不到的错误
在这里插入图片描述

尝试打印一下当前目录地址

参考代码:

import sys
 
print sys.argv[0]#获得的是当前执行脚本的位置(若在命令行执行的该命令,则为空)12

打印结果:

在这里插入图片描述

也就是说路径应该是与manage.py处于同一级别的目录下的

在原本基础上加一个app1的路径试试
在这里插入图片描述

成功插入!!!
在这里插入图片描述

接下来就是研究取出来的问题了

为了便于数据库查询 我给数据库表添加了一项id
在这里插入图片描述

当前有一条数据项,是我刚刚添加的文件以及随便写的一个id
在这里插入图片描述

在view.py中添加如下代码,并配置路由,访问localhost:8080/find/

即可执行如下代码

find函数

def find(request):
    #sql = 'select * from student'
    # django 也可以执行原生的sql语句
    #result = Student.objects.raw(sql)

    # 查询name = tom1的数据
    # result = Student.objects.filter(name='tom1')
    result = Asd.objects.filter(id=1)
    """
    result为<class 'django.db.models.query.QuerySet'>的对象
    需要进行数据处理
    """
    arr = []
    for i in result:
        content = {'文件': i.file, 'ID': i.id}
        arr.append(content)

        #把i.file1字节流写入新的文件f2
        with open("app1/img/img1_copy.jpg", "wb") as f2:
            f2.write(i.file)

    print(arr)
    print(type(arr))
    return HttpResponse('数据下载完毕')

通过debug可以看到在循环i中获取到的file1属性是一个字节流bytes类型,接下来我们就拿它开刀,将字节流写入某个位置
在这里插入图片描述

在find函数中添加写入文件的部分

成功!!!
在这里插入图片描述

使用save来update看

k = Example.objects.get(id=481)

k.total_calories = 12

k.save()

非django下的操作

目前已解决django和mysql的文件存取问题,但是由于聚合端并未使用django,所以再接着研究一下如何在非jango框架下进行文件存取操作

#此处为取操作
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', db='django', password='chy352196487')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("select * from filetest")
rows = cursor.fetchall()

sql语法

需要使用原生sql(放一张图免得忘记怎么写)
在这里插入图片描述

示例

update

在这里插入图片描述

from pymysql import *


def main():
    # 创建connection连接
    conn = connect(host='', port=3306, database='', user='',
                   password='', charset='utf8')
    # 获取cursor对象
    cs1 = conn.cursor()
    # 执行sql语句
    query = "update 表名 set 字段1 = 值1 where 字段2 = '{}'".format(2)
    cs1.execute(query)

    # 提交之前的操作,如果之前已经执行多次的execute,那么就都进行提交
    conn.commit()

    # 关闭cursor对象
    cs1.close()
    # 关闭connection对象
    conn.close()


if __name__ == '__main__':
    main()

通过debug可以看出取出来的rows里面也能获取到文件的字节流,这就和前面的模块联系起来了
在这里插入图片描述

Pymyql模块的execute()总结

python写法
#! python3
# @Project:  mysite - sqlhelper.py
# @Info   :  提取sql的基本方法
import pymysql
 
 
def get_connection():
    """连接数据库"""
    # 连接数据库
    connect = pymysql.Connect(
        host='localhost',
        port=3306,
        user='root',
        passwd='123456',
        db='test1',
        charset='utf8'
    )
    # 获取游标(指定获取的数据格式,这里设定返回dict格式)
    return connect, connect.cursor(cursor=pymysql.cursors.DictCursor)
 
 
def select_all(sql, args=None):
    """查询所有"""
    conn, cursor = get_connection()
    cursor.execute(sql, args)
    results = cursor.fetchall()
    cursor.close()
    conn.close()
    return results
 
 
def select_one(sql, args):
    """查询一个"""
    conn, cursor = get_connection()
    cursor.execute(sql, args)
    result = cursor.fetchone()
    cursor.close()
    conn.close()
    return result
 
 
def update(sql, args):
    """修改数据"""
    conn, cursor = get_connection()
    cursor.execute(sql, args)
    conn.commit()
    cursor.close()
    conn.close()
 
 
def create(sql, args):
    """新增数据"""
    conn, cursor = get_connection()
    cursor.execute(sql, args)
    conn.commit()
    cursor.close()
    conn.close()
 
 
def delete(sql, args):
    """删除数据"""
    conn, cursor = get_connection()
    cursor.execute(sql, args)
    conn.commit()
    cursor.close()
    conn.close()
 
sql写法
insert into teacher(name) values (%s) 正确
官方文档

在这里插入图片描述

模块化

接下来是模块化的工作,这里定义一下需要模块化的功能

1、输入字节流,存入到path中文件

2、输入文件path,获取字节流

def get_bytes_from_path(path):
    strb = ''
    strb = strb.encode()
    with open(path, "rb") as f:
        # 循环读取一张图片,一次性读取1024个字节
        while True:
            strb += f.read(1024)
            if strb == b"":
                break
    return strb

3、输入path,更新数据库文件

def update_db_model2(path):
    file = get_bytes_from_path(path)
    k = Asd.objects.get(id=1)
    k.file = file
    k.save()

4、根据id从数据库获取model文件并加载到模型上

format函数用法

在这里插入图片描述

print('{我}今天{action}'.format(='拦路雨',action ='在写博客'))  # 通过关键字

购买阿里云MysqlRDS服务后也在远程连接上测试成功

Django模板(环境移植)问题:

pip install django-bootstrap3

套用到目前已有的框架上

每次得到聚合端返回后对数据库中的model进行更新,默认id为1

首先是在现有框架上配置数据库

当前进度

在原有项目框架下,django后端与数据库的文件已交互完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芜湖大司码丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值