使用Golang、JSON和JavaScript动态显示SQL数据库中的数据

使用Golang、JSON和JavaScript动态显示SQL数据库中的数据,go,Go,我有一个Golang服务器,它从数据库表中获取所有行 SELECT * FROM people; 获取的数据被“封送”为JSON: json.NewEncoder(w).Encode(people) JavaScript可以通过其fetchapi获取行 现在假设数据库表有10000行,但我只想在屏幕上显示尽可能多的行 当我滚动页面时,我希望从数据库中动态获取更多的行 客户机是否需要向服务器发送数据,告诉服务器再次获取JSON和更多数据 如有任何建议,我将不胜感激。谢谢大家! 假设您正在寻找的

我有一个Golang服务器,它从数据库表中获取所有行

SELECT * FROM people;
获取的数据被“封送”为JSON:

json.NewEncoder(w).Encode(people)
JavaScript可以通过其fetchapi获取行

现在假设数据库表有10000行,但我只想在屏幕上显示尽可能多的行

当我滚动页面时,我希望从数据库中动态获取更多的行

客户机是否需要向服务器发送数据,告诉服务器再次获取JSON和更多数据


如有任何建议,我将不胜感激。谢谢大家!

假设您正在寻找的是分页,那么答案很简单,但需要在客户端和服务器端进行更改:

获取数据:您希望客户端告诉服务器批量数据的大小(通常每次调用10、20、30、40或50个结果,默认值为10)。
您希望从客户端获得的第二个参数是指示客户端已经在其端加载了多少个结果

使用这两个值,您将能够丰富查询,以包括限制和偏移值。默认偏移量为0,默认限制为10

这意味着第一个查询将类似于:

SELECT * FROM people LIMIT 10 OFFSET 0; 
这通常被缩短为
限制10或<代码>限制0,10

现在,如果客户端向下滚动,要加载接下来的10条记录,您需要它们执行一个AJAX调用,提供批大小和偏移量值(已经显示了多少条记录),然后插入这些值,您将得到:

SELECT * FROM people LIMIT 10 OFFSET 10;
此查询告诉DB跳过前10个结果,然后返回下10个结果

如果您使用的是实际页面,另一种常见的处理方法是让客户端提供页面大小值和页码。例如:我想每页看到20个人,我想直接从第1页跳到第5页,传递给服务器的参数如下:
page\u size=20&page=5

这意味着我需要一个跳过前80条记录(20乘以4页)的查询,这是一个简单的计算:

offset := pageNr * pageSize - pageSize // or (pageNr -1 ) * pageSize
要将查询设置为:

SELECT * FROM people LIMIT 20 OFFSET 80;
一些一般提示:

  • 尽量避免
    SELECT*
    ,始终明确选择的字段。向表中添加字段是很常见的,使用
    select*
    可能会导致暴露您不希望别人看到的数据,或者由于无法处理新字段而导致代码混乱
  • 指定数据的顺序。在表中的
字段处创建一个,并按该值排序,或按名称或其他方式排序。如果不以特定方式对结果进行排序,如何保证前10个结果始终相同?如果你不能保证这一点,为什么你不可能跳过一些记录,并显示其他两次呢
  • 创建一个
    People
    类型的服务器端,表示数据库中的记录(如果尚未创建)

  • 我已经很多年没有做任何前端工作了,但是为了知道何时需要加载更多记录,您需要编写一些JS来处理
    scroll
    事件。已经有很多插件了,我的JS很可能已经过时了,但这里有一个尝试(未经测试,将被视为伪代码):


    假设您正在寻找的是分页,那么答案很简单,但需要在客户端和服务器端进行更改:

    获取数据:您希望客户端告诉服务器批量数据的大小(通常每次调用10、20、30、40或50个结果,默认值为10)。
    您希望从客户端获得的第二个参数是指示客户端已经在其端加载了多少个结果

    使用这两个值,您将能够丰富查询,以包括限制和偏移值。默认偏移量为0,默认限制为10

    这意味着第一个查询将类似于:

    SELECT * FROM people LIMIT 10 OFFSET 0; 
    
    这通常被缩短为
    限制10或<代码>限制0,10

    现在,如果客户端向下滚动,要加载接下来的10条记录,您需要它们执行一个AJAX调用,提供批大小和偏移量值(已经显示了多少条记录),然后插入这些值,您将得到:

    SELECT * FROM people LIMIT 10 OFFSET 10;
    
    此查询告诉DB跳过前10个结果,然后返回下10个结果

    如果您使用的是实际页面,另一种常见的处理方法是让客户端提供页面大小值和页码。例如:我想每页看到20个人,我想直接从第1页跳到第5页,传递给服务器的参数如下:
    page\u size=20&page=5

    这意味着我需要一个跳过前80条记录(20乘以4页)的查询,这是一个简单的计算:

    offset := pageNr * pageSize - pageSize // or (pageNr -1 ) * pageSize
    
    要将查询设置为:

    SELECT * FROM people LIMIT 20 OFFSET 80;
    
    一些一般提示:

    • 尽量避免
      SELECT*
      ,始终明确选择的字段。向表中添加字段是很常见的,使用
      select*
      可能会导致暴露您不希望别人看到的数据,或者由于无法处理新字段而导致代码混乱
    • 指定数据的顺序。在表中的
    字段处创建一个,并按该值排序,或按名称或其他方式排序。如果不以特定方式对结果进行排序,如何保证前10个结果始终相同?如果你不能保证这一点,为什么你不可能跳过一些记录,并显示其他两次呢
  • 创建一个
    People
    类型的服务器端,表示数据库中的记录(如果尚未创建)

  • 我已经很多年没有做任何前端工作了,但是要知道什么时候需要加载更多的记录,你需要