Linux 服务如何使用 curl 利用 HTTP Get 请求传入 SQL 语句修改数据库表内容和结构


Linux
本文是博主在部署项目时发现的一个小技巧,项目部署在 Linux 虚拟机上,数据库被设置了写权限,作为开发只能使用程序对数据库做增删改查,但是在开发测试阶段会出现很多问题,权限的问题大大降低了开发效率,所以这个技巧会提高开发效率。


1、项目依赖和代码


首先要部署项目确认是否可以使用 curl

本次项目是使用 SpringBoot 3 项目,使用方法调用 SQL 语句需要以下依赖:

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- MyBatis-Plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    </dependency>
    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
 </dependencies>   

核心代码如下:


package cn.com.wind.server.controller;

import cn.com.wind.IMStarter.common.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/system")
public class SystemController {

    private final JdbcTemplate jdbcTemplate;

    public SystemController(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @GetMapping("/operateDataBase")
    public Response<?> operateDataBase(@RequestParam("sql") String sql) {
        Map<String, Object> response = new HashMap<>();
        try {
            int result = jdbcTemplate.update(sql);
            response.put("status", "success");
            response.put("affectedRows", result);
            return Response.success(response);
        } catch (Exception e) {
            response.put("status", "error");
            response.put("message", e.getMessage());
            return Response.fail(400, "SQL 执行出错");
        }
    }
}

2、设置两条 SQL语句

使用数据库表 user_role,在 user_database 下,表格字段有三个 uidnamerole,下面使用来个常见的语句作为解析:

INSERT INTO user_database.user_role (uid, role) VALUES (100100, 0)
UPDATE user_database.user_role SET role=2 WHERE uid=100100

在 Linux 中使用 curl 要注意有些字符会被 Base 解释器解释错误,需要进行转译。

假设访问 IP 地址和端口如下所示:

http://localhost:8086/system/operateDataBase?sql=' ' 

3、SQL 语句改造


第一条 INSERT 语句如下:

curl 'http://localhost:8086/system/operateDataBase?sql=INSERT%20INTO%20user_database.user_role%20(uid, role)%20VALUES%20(110359024,0)'

后半部分如下:

INSERT%20INTO%20user_database.user_role%20(uid,role)%20VALUES%20(110359024,0)

第二条 UPDATE 语句如下:

curl 'http://localhost:8086/system/operateDataBase?sql=UPDATE%20user_database.user_role%20SET%20role=2%20WHERE%20uid=100100'

后半部分如下:

UPDATE%20user_database.user_role%20SET%20role=2%20WHERE%20uid=100100

4、注意事项

首先,语句中的空格要做对应的解析,user_database.user_role 这里面的 . 可以不使用转译字符代替。

  • %20:空格
  • %2E.
  • %27' ,最外层的地方的单引号不需要转译。

另外,在 curl 命令中,URL 中的 括号逗号 不需要特别编码,但为了确保命令在 Bash 中正确解析,建议使用 单引号双引号 将整个 URL 包裹起来。这样可以避免 Bash 对括号和逗号进行特殊处理。

  • 单引号可以防止 Bash 对括号和逗号进行特殊处理。这是最简单和最安全的方法。
  • 双引号也可以防止 Bash 对括号和逗号进行特殊处理,但需要注意 URL 中的特殊字符(如 $)可能会被 Bash 解释。

我个人使用的单引号,可以满足使用要求。

在 INSERT 语句中,有的朋友喜欢在 后面加一个空格,或者 = 后面加一个空格,这个时候也是需要使用 %20 转译。

INSERT%20INTO%20user_database.user_role%20(uid,%20role)%20VALUES%20(110359024,%200)
UPDATE%20user_database.user_role%20SET%20role%20=%202%20WHERE%20uid%20=%20100100

由于操作的数据库权限等级很高,建议使用者现在本地数据库做测试。

通过以上方法,你应该能够成功发送 curl 请求,而不会遇到 Bash 语法错误。


5、扩展修改数据库表结构语句


现阶段数据库表 user_database.user_role 只有 uid 一个主键,要将表中的 role 字段与现有的 uid 字段一起设置为主键,可以使用 ALTER TABLE 语句来修改表结构。

  • 删除现有的主键:如果 uid 已经是主键,首先需要删除现有的主键。
    ALTER TABLE user_database.user_role DROP PRIMARY KEY;
    
  • 添加新的复合主键:将 uidrole 一起设置为复合主键。
    ALTER TABLE user_database.user_role ADD PRIMARY KEY (uid, role);
    
  • 设置 role 不能为空
    ALTER TABLE private_quotation_db.user_role MODIFY role INT NOT NULL;
    

对应的 curl 命令

  • 删除现有的主键

    curl 'http://localhost:8086/system/operateDataBase?sql=ALTER%20TABLE%20user_database.user_role%20DROP%20PRIMARY%20KEY'
    
    ALTER%20TABLE%20user_database.user_role%20DROP%20PRIMARY%20KEY
    
  • 添加新的复合主键

    curl 'http://localhost:8086/system/operateDataBase?sql=ALTER%20TABLE%20user_database.user_role%20ADD%20PRIMARY%20KEY%20(uid,%20role)'
    
    ALTER%20TABLE%20user_database.user_role%20ADD%20PRIMARY%20KEY%20(uid,%20role)
    
  • 设置 role 不能为空

    curl 'http://localhost:8086/system/operateDataBase?sql=ALTER%20TABLE%20user_database.user_role%20MODIFY%20role%20INT%20NOT%20NULL'
    
    ALTER%20TABLE%20user_database.user_role%20MODIFY%20role%20INT%20NOT%20NULL
    

相信大家看完这篇内容之后,应该会使用这个技巧了,具体的语句不会写可以问以下对应的 AI 软件,祝大家开发愉快。

from flask import Flask, request, jsonify import pymssql app = Flask(__name__) # 数据库配置 DATABASE_CONFIG = { 'host': '172.xx.xx.xxx', # 自己的数据库地址 'port': '1433', 'user': 'itecxxx', # 自己数据库的账户 'password': 'Qwert@xxxx#', #自己数据库的密码 'database': 'IportalData', # 自己数据库的库名 'charset': 'utf8' } # 新增根路径路由 @app.route('/') def home(): return "欢迎访问SQL Server接口服务!" # 自定GET义返回内容 @app.route('/query', methods=['POST']) def query_database(): print("接收到请求") # 获取关键字 keyword = request.json.get('keyword') print("keyword为:" + keyword) if not keyword: return jsonify({"error": "Keyword is required"}), 400 # 参数化查询,避免 SQL 注入,修改成自己的库 query = """ SELECT Shop, [KPI Area], SAP_TP_name, SAP_Text, Prodtag, Ausfallzeit, SD_Bewertung_Ebene1, SD_Bewertung_Ebene2, SD_Bewertung_Ebene3, SD_Bewertung_Ebene4 FROM Classification WHERE (Prodtag between '2025-03-01' and '2025-03-12') and (SAP_Text LIKE %s) """ params = ('%' + keyword + '%',) try: # 建立数据库连接 connection = pymssql.connect(**DATABASE_CONFIG) with connection.cursor(as_dict=True) as cursor: # 执行查询 cursor.execute(query, params) result = cursor.fetchall() connection.commit() connection.close() if not result: return"未查询到有效数据", 400 # 生成 Markdown 格 markdown_table = generate_markdown_table(result) return markdown_table, 200 except Exception as e: return str(e), 500 def generate_markdown_table(results): """ 生成 Markdown 格 """ if not results: return"" # 获取列名 columns = results[0].keys() # 头 table_md = "| " + " | ".join([col for col in columns]) + " |\n" # 分隔线 table_md += "| " + " --- |" * len(columns) + "\n" # 内容 for row in results: table_md += "| " + " | ".join([str(cell) for cell in row.values()]) + " |\n" return table_md if __name__ == '__main__': # 注意这里绑定本机的内容ip,省事点,就0.0.0.0即可。不要绑定127.0.0.1,docker内访问不到 app.run(host='0.0.0.0', port=8000) # app.run(host='0.0.0.0', port=5000) 可以帮我改代码,写一个服务,我想POST的内容是Body为form-data,key是sql,value是sql语句
最新发布
03-18
### 使用Token调用API并写入Doris的最佳实践 #### 1. 调用API获取Token 为了安全有效地访问受保护的资源,在首次请求时通常需要先向认证服务发送凭证来换取令牌(token)。这一步骤可以通过POST方法完成,具体实现如下: ```bash curl -X POST https://example.com/api/auth \ -H "Content-Type: application/json" \ -d '{"username":"your_username","password":"your_password"}' ``` 服务器验证通过后会返回一个JSON对象,其中包含了用于后续请求的身份验证所需的`access_token`字段[^2]。 #### 2. 将Token设置为Header传递给目标API 一旦获得了有效的token,就可以将其加入到HTTP头部中作为Bearer Token来进行授权操作。下面是一个利用cURL命令行工具的例子,展示了如何携带之前获得的token发起GET/POST请求: ```bash curl -X POST https://api.example.com/data/write \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN_HERE" \ -H "Content-Type: application/json" \ -d @data.json ``` 这里的`YOUR_ACCESS_TOKEN_HERE`应替换为实际取得的有效token字符串;而`@data.json`则指向本地文件路径,该文件内存储着准备要插入至Doris中的记录集[^1]。 #### 3. 数据处理与校验 考虑到数据质量的重要性,在执行批量导入前建议预先设定合理的错误容忍度参数。例如,可以指定允许存在一定比例的数据异常而不影响整体任务的成功与否。对于Doris而言,默认情况下不允许有任何单条目违反约束条件的情况发生——即所谓的“严格模式”,此时任何不符合预期格式或范围限制的信息都将导致整个批次的操作终止[^3]。 因此,在构建payload时应当充分考虑这一点,并尽可能确保所提供资料的一致性准确性。如果确实存在不可避免的小概率偏差,则可以在提交指令时适当调整相关配置项以适应实际情况的需求。 #### 4. 插入数据到Doris 最后一步就是真正意义上地把经过清洗整理后的有效载荷送达到目的地—Doris数据库对应的格里去。假设已经完成了前面提到的各项准备工作,那么现在只需要按照既定的方式构造好SQL语句并通过合适的客户端库或者RESTful API端点发出即可达成目的。 ```sql INSERT INTO doris_table (column1, column2,...) VALUES (?, ?, ...); ``` 值得注意的是,当采用编程方式自动化上述流程的时候,务必妥善保管好敏感信息比如用户名密码以及私钥证书之类的材料,避免泄露风险的同时也要遵循最小权限原则只赋予必要的读取/修改权利给应用程序本身。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值