开发之旅~

分割线

简介

一顿课程下来,SQL 语法是熟悉了,但是做到业务层面,不圆滑之处暴露出来惹.

不只是 SQL,包括工作中常用的技巧.

分割线

数据库

模糊查询

  • 包括模糊查询中文 [1] [2]

    中/英都可以正常查询:

    <select id="selectByBean" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from test
    <where>
    <if test="name != null and name != ''">
    and name like concat('%',#{name},'%')
    </if>
    <if test="url != null and url != ''">
    and cut_url like concat('%',#{url},'%')
    </if>
    </where>
    </select>

where

  • 开发中可能经常见到: where 1 = 1 ,这是干什么用的?

  • 拿上面的举例子,把它变成下面这样子:

    <select id="selectByBean" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from test
    where
    <if test="name != null and name != ''">
    name like concat('%',#{name},'%')
    </if>
    <if test="url != null and url != ''">
    and cut_url like concat('%',#{url},'%')
    </if>
    </select>
  • 如果 name == null,那么 SQL 会是这样:

    where and cut_url like concat(‘%’,#{url},‘%’)

    肯定会报错

  • 改成这样子就没问题了:

    <select id="selectByBean" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from test
    where 1 = 1
    <if test="name != null and name != ''">
    name like concat('%',#{name},'%')
    </if>
    <if test="url != null and url != ''">
    and cut_url like concat('%',#{url},'%')
    </if>
    </select>
  • 在 SQL 支持的情况下,还是套<where>标签更好,它能处理 where and 这种情况.


多索引排序

  • 有时一个表中多个字段需要加索引

    但是这样导致每次添加/更新数据时排序都会变化

    前端接到的数据可以认为是无序化的,如何解决呢?

  • 挺简单的 order by id


Mariadb-无法远程连接

  • 在 manjaro 虚拟机装了个 mariadb

    主机与虚拟机已经连通,但是 mariadb 无法连接上 (授权失败)

    Host ‘192.168.114.1’ is not allowed to connect to this MariaDB server

    因为 mariadb 默认只允许 localhost 连接


  • 网上找了一堆文章,大多是 grant 授权 , 改配置文件 之类的

    试了下,各种碰壁 , 这里给个简单方法


  • 直接 新建一个用户

    用户名随意 , host 填 % (也就是允许所有)

    远程连接时连这个用户就行了.


数据源连接不上

Failed to bind properties under ‘’ to com.zaxxer.hikari.HikariDataSource

  • 这个情况大多是配置属性没写对,重点看一下标记的地方

    20210925193945

外键-数据-导出入

  • 结组做数据库课设时发现,含有外键的表,create table 时会报错.

    解决办法呢,比如下面的三个表

    20211204085119

    先把 player 和 technology 两个表创建好,再创建 good_at 就不会报错了

    (也就是需要先创建外键指向的表,再创建含有外键的表)


  • insert 时还是会遇到问题,跟上面类似

    Error: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (test.test_user, CONSTRAINT fk_test_user_test_user_id FOREIGN KEY (test_user_id) REFERENCES test_user (id))

    先插入 player / technology 表,再插入 good_at 表


    实则还有种变相解决方法是在插入前 foreign_key_checks,插入后再打开:

    set
    FOREIGN_KEY_CHECKS = 0;

    INSERT INTO game(id,name,score,player) VALUES(1,'aggdm',0,2),(2,'cmera',10,10),(3,'hzxgy',10,14),(4,'ihqti',5,12),(5,'hozmy',5,6),(6,'wrcux',1,12),(7,'mlijv',1,9),(8,'qmnij',10,11),(9,'vswdc',7,14),(10,'gebit',6,11);

    set
    FOREIGN_KEY_CHECKS = 1;

mongodb

  • mongo find array size>1 的记录

    db.image.find({ images : { $size: { $gt : 1 } }}) 这样是不行的, Query failed with error code 2 with name ‘BadValue’ and error message ‘$size needs a number’ on server [6]

    db.prompt_krea.find({"$expr":{$gt :[{$size: "$images"},1]}})
  • mongodb update array [5]

    db.image.update({ nums : { $addToSet: 123 } })

分割线

接口问题

接口数据速览

  • 前端接到 JSON 数据总是需要看一下,通过 postman 那种不是很便捷

    于是之前我一直是找到响应->复制->粘贴到 vscode 格式化

    20211015130205
  • 偶然发现有个更方便的手段: 浏览器前端助手插件

    安装后直接双击请求,跳出的新页面就是已经格式化好的

    20211015130109 20211015130815

API-request-body

在调用 https://securetoken.googleapis.com/v1/token 时, 发现报错:

{
"error": {
"code": 400,
"message": "MISSING_GRANT_TYPE",
"status": "INVALID_ARGUMENT"
}
}

找了半天原因, 以为是参数/header 不对, 最后发现是传入格式不对 (用的 form-data 请求的)

请求的参数一般是用 Body -> JSON 格式, 除非特殊标注用别的格式


本地服务调不通

明明跑起来了服务, 但是接口测试请求就像石沉大海, 发过去没响应

那有可能是端口共用了[4]…如下:

netstat -ano | findstr "8000"
# 或者
netstat -ano | grep 8000

ps | grep 17348

数据获取-方法名设计

最常见的以下几种:

get([1]) 1|n

fetch([1]) n

query(1) 1

find(1) 1

search(1) 1|n


文件传输

一般是使用 form-data -> file 类型


JSON-2-struct

接口可能传过来很多字段, 一个个对应输入很麻烦, apifox 可以直接生成对应 struct, 或者复制 JSON 直接粘贴进 goland 也会生成, 之后再对照下数据类型就行.

分割线

程序写法问题

map-and-filter

  • 开发时遇到此问题:

    Required request body is missing:请求体为空

    纳闷,把前端数据正常传给后端了,为什么触发此错误?

    后来发现是 .map() 的坑,被这个问答糊脸了:
    [3]


  • map 是映射,必然会 return 一个值 (没 return 的话就是 undefined)

    filter 是过滤,可以过滤掉某些结果不 return

    虽然这两个都有 transform 能力但是在返回值上不同


整数计算顺序

开发时碰到一个统计进度的问题 (l: 1-20)

也就是说进度 process = l/20 * 100

但是写出来的程序要注意: process = int(l*100/20)

如果先算 l/20, 因为化整会导致 process 一直为 0

分割线

Devops

ali-k8s-服务调用

阿里云 k8s 容器管理, 不同集群 IP 的容器/服务间也可以不走域名直接内部调用

需要注意内网 https 调用服务会报错, 只能 http, 例如 http://xxx-svc:8000

分割线

借物表

[1]: mysql 中模糊查询的四种用法:

[2]: mybatis 模糊查询 中文问题

[3]: 为什么 javascript map 函数返回 undefined?(Why does javascript map function return undefined?)

[4]: 05 Windows 下查看 IP、端口、网络是否通畅、访问局域网内另一台电脑

[5]: mongodb update array_魂醉的博客-CSDN 博客

[6]: Is there a way to query array fields with size greater than some specified value?