python(18) : flask_sqlalchemy 配置sqlserver数据库对象

1.安装依赖

pip3 install flask_sqlalchemy -i https://mirrors.aliyun.com/pypi/simple/ requests

2.数据库配置信息(db_manager.py)

import os

from flask import Flask
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy

database = 'test'

app = Flask(__name__)

# 设置文件上传大小限制为500MB
app.config['MAX_CONTENT_LENGTH'] = 500 * 1024 * 1024
CORS(app)

if os.path.exists('/root'):
    app.config[
        'SQLALCHEMY_DATABASE_URI'] = f'mssql+pyodbc://root:123456@127.0.0.1:3433/{database}?driver=ODBC+Driver+17+for+SQL+Server&charset=utf8'
else:
    app.config[
        'SQLALCHEMY_DATABASE_URI'] = f'mssql+pyodbc://root:123456@127.0.0.1:1433/{database}?driver=SQL+Server'
db = SQLAlchemy(app)

3.数据表对象

# -*- coding: utf-8 -*-

# ====> 配置管理中心 <==== #

from datetime import datetime

from db_manager import db


# 配置分组
class AISConfGroup(d
<think>在Flask-SQLAlchemy中,为模型类添加带WHERE条件的索引(部分索引)可以通过在字段定义中使用`index`参数,或者使用`__table_args__`属性来定义索引。对于PostgreSQL,我们可以使用`Index`构造器并指定`postgresql_where`参数来创建部分索引。 以下是一个示例模型,假设我们有一个`User`模型,我们想为`is_active`为True的用户在`email`字段上创建一个唯一索引(部分唯一索引)。 步骤: 1. 导入必要的模块:`from sqlalchemy import Index` 2. 在模型类中定义`__table_args__`,它是一个元组,可以包含多个表级别的选项,比如索引。 3. 使用`Index`构造器创建索引,并设置`postgresql_where`参数来指定条件。 示例代码: ```python from flask_sqlalchemy import SQLAlchemy from sqlalchemy import Index, text db = SQLAlchemy() class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), nullable=False) is_active = db.Column(db.Boolean, default=True) # 定义部分索引:只对is_active为True的记录在email上创建唯一索引 __table_args__ = ( Index('idx_active_email', email, unique=True, postgresql_where=(is_active == True)), ) ``` 注意: - 索引的名字('idx_active_email')是自定义的。 - `postgresql_where`参数接受一个条件表达式,这里我们使用了`is_active == True`。注意,在SQLAlchemy中,条件表达式应该使用SQLAlchemy的列表达式(如`is_active == True`)或者使用`text`构造的SQL文本(如`text('is_active is true')`)。 - 在定义部分索引时,确保条件表达式正确,因为不同的数据库对部分索引的支持和语法可能不同。这里我们明确指定`postgresql_where`,因此这个索引只适用于PostgreSQL。 另一种写法是使用`text`构造条件: ```python __table_args__ = ( Index('idx_active_email', email, unique=True, postgresql_where=text('is_active is true')), ) ``` 但是,使用`text`构造时要注意,它直接传递SQL片段,因此要确保SQL语法正确且与数据库匹配。 另外,如果模型已经定义并且需要添加索引,可以考虑使用迁移工具(如Alembic)来添加索引到数据库。 解释: - 上述代码在`User`模型上定义了一个部分唯一索引,该索引只在`is_active`为True时生效,确保这些记录的`email`是唯一的。 - 当`is_active`为False时,相同的`email`可以存在多条记录。 注意事项: - 部分索引在大型表中可以显著提高查询性能并减少索引大小,因为它只索引满足条件的行。 - 在定义索引时,请确保条件与你的查询条件匹配,以使其生效。 如果使用Alembic进行迁移,那么当生成迁移脚本时,应该能够检测到这个索引并生成相应的创建索引的迁移语句。 相关问题: - 如何为其他数据库(如MySQL)创建部分索引? - 如何在Flask-SQLAlchemy中创建多列索引? - 如何为索引指定排序(升序或降序)? - 如何使用Alembic迁移工具添加或删除索引?</think>在 Flask-SQLAlchemy 中为 PostgreSQL 数据库模型添加带 WHERE 条件的索引(部分索引),可以通过 SQLAlchemy 的 `Index` 构造器结合 PostgreSQL 特定的 `postgresql_where` 参数实现。以下是详细解决方案: ### 解决方案代码 ```python from flask_sqlalchemy import SQLAlchemy from sqlalchemy import Index, text db = SQLAlchemy() class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True) is_active = db.Column(db.Boolean, default=True) # 用于条件索引的字段 created_at = db.Column(db.DateTime, server_default=db.func.now()) # 定义带 WHERE 条件的部分索引 (PostgreSQL 专用) __table_args__ = ( # 示例1: 只在 is_active=True 时创建 username 唯一索引 Index( 'idx_active_username', username, unique=True, postgresql_where=(is_active == True) # WHERE 条件 ), # 示例2: 使用 text() 构造复杂条件 Index( 'idx_recent_active_users', created_at, postgresql_where=text("is_active AND created_at > now() - interval '30 days'") ), ) ``` ### 关键点解释 1. **`__table_args__` 属性** 用于定义表级选项(如索引),必须是元组或字典格式。 2. **`Index` 构造器参数**: - **索引名称**:第一个位置参数(如 `'idx_active_username'`) - **索引字段**:后续位置参数(如 `username`) - **`unique=True`**:创建唯一约束索引 - **`postgresql_where`**:PostgreSQL 专用参数,接受 SQLAlchemy 布尔表达式或 `text()` SQL 片段 3. **WHERE 条件写法**: - **简单条件**:直接使用列表达式(如 `is_active == True`) - **复杂条件**:使用 `text()` 包裹原生 SQL(如 `text("is_active AND created_at > ...")`) 4. **生成的 SQL**(迁移时): ```sql -- 示例1生成的SQL CREATE UNIQUE INDEX idx_active_username ON users (username) WHERE is_active = true; -- 示例2生成的SQL CREATE INDEX idx_recent_active_users ON users (created_at) WHERE is_active AND created_at > now() - interval '30 days'; ``` ### 使用注意事项 1. **数据库迁移**: - 使用 Alembic 迁移工具生成迁移脚本 - 运行 `flask db migrate` 生成包含索引创建的迁移文件 - 检查生成的 SQL 确保 WHERE 条件正确 2. **条件表达式**: - 使用 SQLAlchemy对象(如 `User.is_active`)而非 Python 值 - 涉及日期计算等复杂操作时,优先使用 `text()` 保证准确翻译 3. **索引优化**: - 部分索引适合过滤掉大量不常用数据(如软删除、状态过滤) - 确保 WHERE 条件匹配查询的过滤条件 ### 完整示例项目结构 ``` project/ ├── app.py ├── models.py └── migrations/ (由 Alembic 生成) ``` 在 `models.py` 中定义带条件索引的模型后,通过 Alembic 迁移到数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值