sqlalchemy CreateIndex

一、CreateIndex 的工作原理

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

二、代码示例

python 复制代码
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. 声明式风格中使用

python 复制代码
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. 对现有表添加索引

python 复制代码
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) 等方法,那么数据库中不会生成相应的索引。如果你还有其他疑问,比如如何验证索引是否成功创建,或者如何删除已有的索引,可以继续向我询问。

相关推荐
崖山数据库系统YashanDB12 分钟前
YashanDB json语法
数据库
陈三一16 分钟前
关于多数据源下Spring声明式事务管理失效问题的分析与解决
数据库·spring
我有医保我先冲1 小时前
SQL复杂查询与性能优化全攻略
数据库·sql·性能优化
烧瓶里的西瓜皮1 小时前
Go语言从零构建SQL数据库引擎(2)
数据库·sql·golang
SelectDB1 小时前
拉卡拉 x Apache Doris:统一金融场景 OLAP 引擎,查询提速 15 倍,资源直降 52%
大数据·数据库·数据分析
爱的叹息1 小时前
华为高斯(GaussDB) 集中式数据库 的开发技术手册,涵盖核心功能、开发流程、优化技巧及常见问题解决方案
数据库·gaussdb
背太阳的牧羊人1 小时前
使用 PyMuPDF(fitz)库打开 PDF 文件,并且是从内存中的字节流(BytesIO)读取 PDF 内容
数据库·pdf·文件处理·pymupdf·fitz
@淡 定3 小时前
MySQL MVCC 机制解析
数据库·mysql
Chandler243 小时前
Redis:内存淘汰原则,缓存击穿,缓存穿透,缓存雪崩
数据库·redis·缓存
SRC_BLUE_173 小时前
Python GUI 编程 | QObject 控件基类详解 — 定时器
开发语言·数据库·python