Forráskód Böngészése

数据库初始化
使用SQLAlchemy进行数据库增删改查
SQLAlchemy模型定义
配置信息读取
模型查询接口实现

drggboy 5 hónapja
szülő
commit
6c9478555d
5 módosított fájl, 131 hozzáadás és 11 törlés
  1. BIN
      api/SoilAcidification.db
  2. 8 2
      api/app/__init__.py
  3. 3 2
      api/app/config.py
  4. 24 0
      api/app/database_models.py
  5. 96 7
      api/app/routes.py

BIN
api/SoilAcidification.db


+ 8 - 2
api/app/__init__.py

@@ -1,16 +1,22 @@
 from flask import Flask
 from flask_cors import CORS
+from . import config
+from flask_sqlalchemy import SQLAlchemy
 
+# 创建 SQLAlchemy 全局实例
+db = SQLAlchemy()
 
 # 创建并配置 Flask 应用
 def create_app():
     app = Flask(__name__)
     CORS(app)
     # 进行初始配置,加载配置文件等
-    # app.config.from_object('config.Config')
+    app.config.from_object(config.Configs)
+
+    # 初始化 SQLAlchemy
+    db.init_app(app)
 
     # 导入路由
     from . import routes
     app.register_blueprint(routes.bp)
-
     return app

+ 3 - 2
api/app/config.py

@@ -1,8 +1,9 @@
 import os
 
-class Config:
+class Configs:
     SECRET_KEY = 'your_secret_key'
     DEBUG = True
     MODEL_PATH = 'model_optimize/pkl/RF_filt.pkl'
-    DATABASE = os.path.join(os.path.dirname(__file__), 'SoilAcidification.db')
+    DATABASE = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'SoilAcidification.db')
+    SQLALCHEMY_DATABASE_URI = f'sqlite:///{DATABASE}'
     UPLOAD_FOLDER = os.path.join(os.path.dirname(__file__), 'uploads')

+ 24 - 0
api/app/database_models.py

@@ -0,0 +1,24 @@
+from . import db
+
+class Model(db.Model):
+    __tablename__ = 'Models'
+
+    ModelID = db.Column(db.Integer, primary_key=True)
+    ModelName = db.Column(db.Text, nullable=False)
+    ModelType = db.Column(db.Text, nullable=False)
+    CreatedAt = db.Column(db.TIMESTAMP, default=db.func.current_timestamp())
+    Description = db.Column(db.Text)
+    
+    # # 添加与 ModelParameters 表的关系
+    # parameters = db.relationship('ModelParameters', backref='model', lazy=True)
+
+class ModelParameters(db.Model):
+    __tablename__ = 'ModelParameters'  # 指定表名
+
+    ParamID = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 主键
+    ModelID = db.Column(db.Integer, db.ForeignKey('Models.ModelID'), nullable=False)  # 外键,指向 Models 表的 ModelID
+    ParamName = db.Column(db.Text, nullable=False)  # 参数名
+    ParamValue = db.Column(db.Text, nullable=False)  # 参数值
+
+    # 定义反向关系
+    model = db.relationship('Model', backref=db.backref('parameters', lazy=True))

+ 96 - 7
api/app/routes.py

@@ -4,17 +4,106 @@ from flask import Blueprint, request, jsonify, g, current_app
 from .model import predict
 import pandas as pd
 from flask_sqlalchemy import SQLAlchemy
+from . import db  # 从 app 包导入 db 实例
+from sqlalchemy.engine.reflection import Inspector
+from .database_models import Model, ModelParameters
 
 # 创建蓝图 (Blueprint),用于分离路由
 bp = Blueprint('routes', __name__)
 
-def get_db():
-    db = getattr(g, '_database', None)
-    if db is None:
-        # database_url = current_app.config['DATABASE']
-        # db = g._database = sqlite3.connect(database_url)
-        db = SQLAlchemy(current_app)
-    return db
+@bp.route('/tables', methods=['GET'])
+def list_tables():
+    engine = db.engine  # 使用 db 实例的 engine
+    inspector = Inspector.from_engine(engine)  # 创建 Inspector 对象
+    table_names = inspector.get_table_names()  # 获取所有表名
+    return jsonify(table_names)  # 以 JSON 形式返回表名列表
+
+@bp.route('/models/<int:model_id>', methods=['GET'])
+def get_model(model_id):
+    try:
+        model = Model.query.filter_by(ModelID=model_id).first()
+        if model:
+            return jsonify({
+                'ModelID': model.ModelID,
+                'ModelName': model.ModelName,
+                'ModelType': model.ModelType,
+                'CreatedAt': model.CreatedAt.strftime('%Y-%m-%d %H:%M:%S'),
+                'Description': model.Description
+            })
+        else:
+            return jsonify({'message': 'Model not found'}), 404
+    except Exception as e:
+        return jsonify({'error': 'Internal server error', 'message': str(e)}), 500
+
+@bp.route('/models', methods=['GET'])
+def get_all_models():
+    try:
+        models = Model.query.all()  # 获取所有模型数据
+        if models:
+            result = [
+                {
+                    'ModelID': model.ModelID,
+                    'ModelName': model.ModelName,
+                    'ModelType': model.ModelType,
+                    'CreatedAt': model.CreatedAt.strftime('%Y-%m-%d %H:%M:%S'),
+                    'Description': model.Description
+                }
+                for model in models
+            ]
+            return jsonify(result)
+        else:
+            return jsonify({'message': 'No models found'}), 404
+    except Exception as e:
+        return jsonify({'error': 'Internal server error', 'message': str(e)}), 500
+
+@bp.route('/model-parameters', methods=['GET'])
+def get_all_model_parameters():
+    try:
+        parameters = ModelParameters.query.all()  # 获取所有参数数据
+        if parameters:
+            result = [
+                {
+                    'ParamID': param.ParamID,
+                    'ModelID': param.ModelID,
+                    'ParamName': param.ParamName,
+                    'ParamValue': param.ParamValue
+                }
+                for param in parameters
+            ]
+            return jsonify(result)
+        else:
+            return jsonify({'message': 'No parameters found'}), 404
+    except Exception as e:
+        return jsonify({'error': 'Internal server error', 'message': str(e)}), 500
+
+@bp.route('/models/<int:model_id>/parameters', methods=['GET'])
+def get_model_parameters(model_id):
+    try:
+        model = Model.query.filter_by(ModelID=model_id).first()
+        if model:
+            # 获取该模型的所有参数
+            parameters = [
+                {
+                    'ParamID': param.ParamID,
+                    'ParamName': param.ParamName,
+                    'ParamValue': param.ParamValue
+                }
+                for param in model.parameters
+            ]
+            
+            # 返回模型参数信息
+            return jsonify({
+                'ModelID': model.ModelID,
+                'ModelName': model.ModelName,
+                'ModelType': model.ModelType,
+                'CreatedAt': model.CreatedAt.strftime('%Y-%m-%d %H:%M:%S'),
+                'Description': model.Description,
+                'Parameters': parameters
+            })
+        else:
+            return jsonify({'message': 'Model not found'}), 404
+    except Exception as e:
+        return jsonify({'error': 'Internal server error', 'message': str(e)}), 500
 
 
 @bp.route('/predict', methods=['POST'])