【问题标题】:How to dealing rest api with huge data using mySQL, Django, vueJS如何使用 mySQL、Django、vueJS 处理带有大量数据的 rest api
【发布时间】:2021-03-25 01:53:40
【问题描述】:

情况:

  1. VueJS 向 Django 请求获取 mySQL 中的所有数据。
  2. 使用 Django 加载 mySQL 数据(CSV 格式的文件大小约为 8GB)即可。
  3. Django 使用此数据做出响应并将其发送回 vueJS。

问题是3。 最终,前端(vueJS)不仅要实现所有数据无损,还要向用户展示。

有什么方法可以加快速度吗?

在我看来,API 链接方式有点像下面这样有用。 请求)

let amout_rows = 20
axios.get("url/" + amout_rows)
.then((res) => {
    if (res.data.status === 200) {
        axios.get("url/" + amout_rows+20) {
            .then((res) => {.. continues}.catch(()=>{})
        }
    }
}).catch((err) => {
console.log(err)
})

姜戈

从 mySQL 收集数据 响应(数据=数据,状态=200)

在这种情况下,API(事务)经常发生,所以我认为解决这个问题非常糟糕 将所有数据交给前端。

我不知道其他的想法和逻辑。

如果有其他方法会非常有帮助谢谢。

【问题讨论】:

  • 有必要直接显示所有数据吗?
  • 或者你可以使用递归策略,比上面的链接更好
  • @kusiaga 你好,kusiaga。首先,是的,我完全支持你。我正在怀疑“真的有必要吗?”但是,不管这个疑问,我的学长想要实施它,所以无论如何我都必须这样做。这让我非常难过和困惑。因此,我真的很想知道您的“递归策略”是什么。
  • 您需要向用户显示 8GB 的​​数据??听起来像治疗失眠症!
  • @RickJames 你好。确实是的。不能否认:)

标签: mysql django api rest vue.js


【解决方案1】:

我不知道它是否会起作用,但这个概念是这样的。你需要决定你的函数在什么条件下会停止递归,你的递归会在什么条件下继续运行。

您可以根据需要进行修改。

async init () {
    try {
        let result = await axios.get('/someurl');
        if (result.data.status == 200) {
            this.someData = result.data.someDataFromServer
            // do execute function recursively
            this.init()
        }
    } catch (error) {
        if (error.response.status != 200) {
            // what you gonna do if the recursive stopped
        }
    }
}

【讨论】:

  • 感谢您提供的具体逻辑代码。 :) 我和我的前辈妥协了。
【解决方案2】:

我和前辈妥协了。

我尝试了两个不同的结果。

一种方式)

通过python从数据库收集数据——mysqlClient连接

前端

axios.get("url/")
.then((res) => {
    if (res.data.status === 200) {
    data_table_HDR = res.data.HDR
    data_table_body = res.data.body
    }
}).catch((err)=>{console.log(err)})

后台

connection = mysqldb.connectoin(connection_info ID,PW,HOST,PORT etc..)
cursor = connection.cursor()
cursor.excute(f"select * from certain_table")
data = cursor.fetchall()
resp_data = {HDR: data[0], body: data[1]}
response(data=data, status=200)

以这种方式,嗯...浏览器的屏幕是白色的“无响应”并且无法正常工作,因此不得不通过窗口的系统管理来终止该进程。 还有我使用pycharm IDE的python IDE,它没有像没有响应一样正常工作,所以我也不得不杀死它。 我向他展示了这种症状(现象)然后令人惊讶的是他的反应有点高兴。 然后他建议如下其他方式,我称之为“B方式”。

B方式)

前端

const isInit = False

do_data_collect() {
    if (isInit === False) {
        this.init()
    } else {
        this.nextStep(user_input_integer)
    }
}
init(user_input_integer) {
    limit_value = user_input_integer
    axios.get("url/" + limit_value)
    .then((res) => {
        if (res.data.status === 200) {
            data_table_HDR = res.data.HDR
            data_table_body = res.data.body
            isInit = True
        }
    }).catch((err)=>{console.log(err)})
}
nextStep(user_input_integer) {
    limit_value = user_input_integer
    offset = limit_value + limit_value

    axios.get({
    url: "url",
    method: "GET",
    headers: {
        token
    },
    params: {
        limit_value: limit_value,
        offset: offset
    })
    .then((res) => {
        if (res.data.status === 200) {
            data_table_body.append(res.data.body)
        }
    }).catch((err)=>{console.log(err)})
}

后台

limit_value = request.get("limit_value")
offset = request.get("offset")
connection = mysqldb.connectoin(connection_info ID,PW,HOST,PORT etc..)
cursor = connection.cursor()
cursor.excute(f"select * from certain_table limit {limit_value} offset {offset}")
data = cursor.fetchall()
resp_data = {HDR: data[0], body: data[1]}
response(data=data, status=200)

以这种B方式, 它像乒乓球一样工作。 具有数量限制和偏移的前端请求。 后端执行读取文件或从数据库获取数据。 前端收到响应并将其结果显示为弹出窗口(对话框)以及当用户 通过鼠标向下滚动,然后 API 再次出现并循环,直到不再出现 数据。

这样,就没有浏览器和 IDE 宕机的问题了。 但是,data_table_body 会附加下一个包含大量数据的数据 以免出现内存问题。

因此,将海量数据的所有数据显示给最终用户并不是一个好主意。 我认为将数据作为文件下载会更好。

我也在吗?在这个世界上演这部工作剧? 实施、测试和比较......每次...... :(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-17
    • 2018-07-20
    • 1970-01-01
    • 2014-03-03
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    相关资源
    最近更新 更多