📜  设计一个 RESTful API 来与 SQLite 数据库交互(1)

📅  最后修改于: 2023-12-03 14:57:39.852000             🧑  作者: Mango

设计 RESTful API 与 SQLite 数据库交互

简介

RESTful API 是现在 Web 开发中比较流行的一种 API 设计方式,它的设计风格非常符合 HTTP 协议,容易实现客户端和服务器之间的通信。而 SQLite 数据库则是一个轻量级的关系型数据库,适合用于小型应用程序中。

在本文中,将介绍如何设计一个符合 RESTful API 风格的接口,用于与 SQLite 数据库进行交互。

设计思路

RESTful API 的设计风格主要有以下几个方面:

  1. 使用 HTTP 方法(GET、POST、PUT、DELETE 等)来表达对资源的操作;
  2. 每个资源都有一个唯一的 URI;
  3. 使用状态码来反映请求的结果。

在与 SQLite 数据库进行交互时,可以将数据库中的表看作资源,每一条数据看作一个实例。所以,我们需要定义以下几个 URI:

  1. /api/table_name:获取所有数据
  2. /api/table_name/id:获取指定 id 的数据
  3. /api/table_name:新增一条数据
  4. /api/table_name/id:修改指定 id 的数据
  5. /api/table_name/id:删除指定 id 的数据

在代码实现时,需要使用 Python 的 Flask 框架。同时,使用 Flask-RESTful 扩展可以方便地创建 RESTful API 接口。

代码实现

首先,需要安装 Flask 和 Flask-RESTful 扩展:

# 安装 Flask 和 Flask-RESTful 扩展
pip install flask
pip install flask-restful

然后,在项目文件夹下创建 app.py 文件,这里是 Flask 应用的入口:

from flask import Flask, jsonify
from flask_restful import Api, Resource, reqparse
import sqlite3

app = Flask(__name__)
api = Api(app)
app.config['JSON_AS_ASCII'] = False  # 解决 jsonify 中文乱码的问题

# 连接 SQLite 数据库
conn = sqlite3.connect('data.db')


# 定义 GET 方法的处理类
class Table(Resource):
    def get(self):
        cursor = conn.execute("SELECT * FROM table_name")
        result = cursor.fetchall()
        return jsonify(result)

    def post(self):
        # 解析请求体中的参数
        parser = reqparse.RequestParser()
        parser.add_argument('field1', type=str, required=True)
        parser.add_argument('field2', type=int, required=True)
        args = parser.parse_args()

        # 新增一条记录
        sql = "INSERT INTO table_name (field1, field2) VALUES (?, ?)"
        cursor = conn.execute(sql, (args['field1'], args['field2']))
        conn.commit()

        # 返回新增记录的 id
        return jsonify({'id': cursor.lastrowid})


# 定义 GET、PUT、DELETE 方法的处理类
class TableId(Resource):
    def get(self, id):
        cursor = conn.execute("SELECT * FROM table_name WHERE id=?", (id,))
        result = cursor.fetchone()
        if not result:
            return {'message': 'id not found'}, 404
        return jsonify(result)

    def put(self, id):
        cursor = conn.execute("SELECT * FROM table_name WHERE id=?", (id,))
        result = cursor.fetchone()
        if not result:
            return {'message': 'id not found'}, 404

        parser = reqparse.RequestParser()
        parser.add_argument('field1', type=str)
        parser.add_argument('field2', type=int)
        args = parser.parse_args()

        # 更新记录
        sql = "UPDATE table_name SET field1=?,field2=? WHERE id=?"
        conn.execute(sql, (args['field1'], args['field2'], id))
        conn.commit()

        return jsonify({'message': 'success'})

    def delete(self, id):
        cursor = conn.execute("SELECT * FROM table_name WHERE id=?", (id,))
        result = cursor.fetchone()
        if not result:
            return {'message': 'id not found'}, 404

        # 删除记录
        sql = "DELETE FROM table_name WHERE id=?"
        conn.execute(sql, (id,))
        conn.commit()

        return jsonify({'message': 'success'})


# 添加 API 路由
api.add_resource(Table, '/api/table_name')
api.add_resource(TableId, '/api/table_name/<int:id>')

上述代码中,首先导入了 Flask、Flask-RESTful 和 sqlite3 等模块。接着,创建了一个 Flask 应用对象和一个 Flask-RESTful 的 API 对象。这里还设置了 app.config['JSON_AS_ASCII'] = False,解决 jsonify 中文乱码的问题。

在创建 API 的时候,定义了两个处理类 Table 和 TableId。其中,Table 处理 GET 和 POST 方法,TableId 处理 GET、PUT 和 DELETE 方法。要实现 RESTful 风格,需要将请求方式和处理方法对应起来。

在定义 GET 方法时,需要根据请求参数从数据库中查询数据,然后使用 jsonify 返回 JSON 格式的数据。如果查询的数据为空,则返回 404 错误。

在定义 POST、PUT、DELETE 方法时,需要先解析请求体中的参数,然后再根据参数操作数据库。操作完成后,通过 jsonify 返回操作结果。

最后,启动 Flask 应用:

if __name__ == '__main__':
    app.run(debug=True)
测试 API 接口

使用 Postman 等工具测试 API 接口,例如:

Postman 示例

结语

本文介绍了如何设计符合 RESTful API 风格的接口,用于与 SQLite 数据库进行交互。通过 Flask 和 Flask-RESTful 扩展,可以很方便地实现 API 接口,并进行测试。