当前位置: 首页 > article >正文

sqlalchemy CreateIndex

一、CreateIndex 的工作原理

  • CreateIndex 本身只是 SQLAlchemy 中的一个构造函数,它只是创建了一个表示索引的对象,而不会直接在数据库中生成索引。
  • 要让索引在数据库中实际生成,需要将这个表示索引的对象通过 metadata.create_all(engine)table.create(engine) 等方法传递给数据库引擎,由引擎将索引创建操作发送到数据库服务器,数据库服务器根据接收到的指令创建相应的索引。

二、代码示例

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, Index


# 创建引擎
engine = create_engine('sqlite:///example.db')


# 创建元数据对象
metadata = MetaData()


# 定义表
users_table = Table('users', metadata,
                  Column('id', Integer, primary_key=True),
                  Column('name', String),
                  Column('age', Integer)
                  )


# 创建索引对象
index = Index('idx_name', users_table.c.name)


# 注意:此时还未在数据库中创建索引


# 调用 create_all 方法将表和索引创建指令发送到数据库
metadata.create_all(engine)

代码解释

  • create_engine('sqlite:///example.db'):创建一个连接到 SQLite 数据库的引擎。
  • MetaData():创建元数据对象,存储表和索引等信息。
  • Table('users', metadata,...):定义一个名为 users 的表。
  • Index('idx_name', users_table.c.name):使用 Index 构造函数创建一个名为 idx_name 的索引对象,但此时仅在 SQLAlchemy 的元数据层面存在该索引信息。
  • metadata.create_all(engine):将元数据对象中存储的表和索引信息发送给数据库引擎,引擎会将表和索引的创建操作发送到数据库服务器,数据库服务器根据这些信息创建表和索引。

三、不同的使用场景

1. 声明式风格中使用

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Index


Base = declarative_base()


class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)
    # 定义索引
    __table_args__ = (
        Index('idx_name', 'name'),
    )


# 创建表和索引
Base.metadata.create_all(engine)

代码解释

  • declarative_base():创建一个基类,用于声明式定义表。
  • class User(Base):定义一个 User 类,映射到数据库中的 users 表。
  • __table_args__ 中的 Index('idx_name', 'name'):定义一个名为 idx_name 的索引。
  • Base.metadata.create_all(engine):将 User 类中定义的表和索引信息发送到数据库进行创建。

2. 对现有表添加索引

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, Index


# 创建引擎
engine = create_engine('sqlite:///example.db')


# 创建元数据对象
metadata = MetaData()


# 反射现有表
metadata.reflect(bind=engine)


# 获取现有表
users_table = metadata.tables['users']


# 创建新索引
new_index = Index('idx_new_index', users_table.c.age)


# 将新索引添加到表
users_table.append_constraint(new_index)


# 将更新发送到数据库
metadata.create_all(engine)

代码解释

  • metadata.reflect(bind=engine):将数据库中的表信息反射到元数据对象中。
  • metadata.tables['users']:从元数据中获取 users 表。
  • Index('idx_new_index', users_table.c.age):创建一个新的索引对象。
  • users_table.append_constraint(new_index):将新索引添加到表中。
  • metadata.create_all(engine):将更新信息发送到数据库,包括新添加的索引,数据库会根据这些信息创建新索引。

四、总结

  • CreateIndexIndex 只是创建了索引的描述对象,需要通过 SQLAlchemy 的 metadata.create_all(engine) 或相关方法将其发送给数据库引擎。
  • 引擎将根据这些信息向数据库服务器发出创建索引的请求,数据库服务器最终执行创建索引的操作。
  • 确保在需要创建索引时,调用相应的方法将索引信息发送给数据库,否则索引仅停留在 SQLAlchemy 的元数据层面,不会在数据库中实际生成。

如果你只调用了 CreateIndex 而忘记了使用 metadata.create_all(engine) 等方法,那么数据库中不会生成相应的索引。如果你还有其他疑问,比如如何验证索引是否成功创建,或者如何删除已有的索引,可以继续向我询问。


http://www.kler.cn/a/472483.html

相关文章:

  • 3D机器视觉的类型、应用和未来趋势
  • SSM-SpringMVC-请求响应、REST、JSON
  • 中国科技统计年鉴EXCEL版(2021-2023年)-社科数据
  • BeanFactory与factoryBean 区别,请用源码分析,及spring中涉及的点,及应用场景
  • Leffa 虚拟试衣论文笔记
  • git撤回提交、删除远端某版本、合并指定版本的更改
  • 第一次使用Git上传本地项目到github上
  • 探索Rancher服务发现机制:容器世界的“导航仪”
  • Spring AI ectorStore
  • 刚体变换矩阵的逆
  • Godot最佳实践个人转述
  • Django中自定义模板字符串
  • Qt QDockWidget详解以及例程
  • 随机梯度下降(SGD)算法的深度剖析与应用探索
  • STM32L051芯片 超低功耗特性概览
  • 高级数据库系统 复习提纲
  • 空间不足导致Oracle集群内存使用率暴增
  • ctfshow 每日练习 web 区 php特性 1-10
  • Java将String类型的html文本中的img路径替换前缀
  • css预处理器sass
  • 设计基于检索增强生成的个性化语言模型(RAG-based LLM)
  • 深入了解 StarRocks 表类型:解锁高效数据分析的密码
  • 基于Spring Boot的电子文档交易系统
  • BERT:深度双向Transformer的预训练用于语言理解
  • 【Nginx】设置https和http同时使用同一个端口访问
  • 极客说|微软 Phi 系列小模型和多模态小模型