[Flask_sqlalchemy] KeyError: 检索时对ChoiceType的类型限制

在使用Flask_sqlalchemy和flask_migrate进行数据库迁移时,遇到KeyError:'0'的问题。问题源于ChoiceType字段在MySQL和PostgreSQL中被错误地存储为varchar(255),而不是声明的整数类型。尝试在'sqlalchemy_utils.types.choice.py'的ChoiceTypeTml中进行字符串类型的搜索,导致错误。解决方案是改用db.create_all()直接创建表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面的代码为源代码,使用flask_migrate对数据库进行生成迁移操作。并且经历过了MySQL与PostgreSQL的测试……(艰难)

status_choices = [
    (0, 'start'),
    (1, 'end')
]
task_status = db.Column(ChoiceType(status_choices, db.Integer()), default=0)

在对表query时却发现始终会出现KeyError('0'),最终在轮子里print发现迁移的时候,即使是ChoiceType里面声明该字段是整数数据库中的字段类型是'varchar(255)',具体表现为搜寻时在‘site-packages/sqlalchemy_utils/types/choice.py’下面ChoiceTypeTml索引时也是采用的字符串类型进行搜寻,在process_result_value方法里面print一下就能看到了,这个整数声明如果用这个迁移工具就是个搞笑的存在吗……

class ChoiceTypeImpl:
    """The implementation for the ``Choice`` usage."""

    def __init__(self, choices):
        if not choices:
            raise ImproperlyConfigured(
                'ChoiceType needs 
### 实现事件日志记录和检索 为了在 Python Flask Web 应用程序中实现事件日志记录和检索功能,可以采用如下方法: #### 使用数据库存储日志数据 创建一个用于保存日志条目的模型类 `LogEntry`。这可以通过 SQLAlchemy ORM 来完成,SQLAlchemy 是一种流行的 SQL 工具包以及对象关系映射器 (ORM),它支持多种类型的数据库。 ```python from datetime import datetime from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class LogEntry(db.Model): id = db.Column(db.Integer, primary_key=True) timestamp = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) level = db.Column(db.String(20), nullable=False) # 日志级别:INFO, WARNING, ERROR 等 message = db.Column(db.Text, nullable=False) def __repr__(self): return f'<LogEntry {self.id}>' ``` 此代码定义了一个简单的表结构来保存日志信息[^1]。 #### 添加路由处理请求并记录日志 当应用程序接收到特定路径下的 HTTP 请求,会触发相应的函数执行逻辑,在这些地方插入对 `LogEntry` 的实例化操作以记录下发生的事件详情。 ```python @app.route('/log_event', methods=['POST']) def log_event(): try: data = request.get_json() new_log_entry = LogEntry(level=data['level'], message=data['message']) db.session.add(new_log_entry) db.session.commit() response = {'status': 'success'} except Exception as e: db.session.rollback() response = {'status': 'error', 'message': str(e)} return jsonify(response) ``` 上述 POST 接口允许客户端发送 JSON 数据来指定要记录的日志等级与消息内容,并将其存入数据库中。 #### 构建查询接口以便于搜索历史日志 提供 GET 方法供外部调用来获取已有的日志列表;可以根据间范围、关键字等因素过滤结果集返回给前端展示。 ```python @app.route('/search_logs') def search_logs(): query_params = request.args.to_dict() page = int(query_params.pop('page', 1)) per_page = int(query_params.pop('per_page', 10)) q = db.session.query(LogEntry).filter_by(**query_params) pagination = q.paginate(page=page, per_page=per_page, error_out=False) logs = [{'id': entry.id, 'timestamp': entry.timestamp.isoformat(), 'level': entry.level, 'message': entry.message} for entry in pagination.items] result = { "total": pagination.total, "pages": pagination.pages, "current_page": page, "logs": logs } return jsonify(result) ``` 这段代码实现了分页机制和支持多条件组合筛选的功能,方便用户按需查找所需的历史日志记录。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值