【问题标题】:How to declare a prefix index in SQLAlchemy?如何在 SQLAlchemy 中声明前缀索引?
【发布时间】:2023-01-28 00:06:39
【问题描述】:

我有一个要索引的 VARCHAR(255) 列,但这超过了 MySQL 中 767 字节的最大索引大小。修复似乎是声明an index prefix,但我无法弄清楚 SQLAlchemy 语法。

我正在使用 SQLAlchemy 2.0.0 和 Python 3.9。目前,我正在通过减少字段宽度来解决这个问题,但我真的不想在生产中诉诸于此。

class BotLog(BaseModel):
    __tablename__ = "bot_log"

    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    title: Mapped[str] = mapped_column(String(190), index=True)
    timestamp_utc: Mapped[datetime]

【问题讨论】:

    标签: sqlalchemy


    【解决方案1】:

    不确定我是否正确理解了您的问题。 在 SQLAlchemy 中,您可以使用 Index 类在特定列上定义带有前缀的索引。以下是如何使用 SQLAlchemy 2.0.0 在“bot_log”表的“title”列上创建前缀为 30 个字符的索引的示例:

    from sqlalchemy import Index
    
    class BotLog(BaseModel):
        __tablename__ = "bot_log"
    
        id = Column(Integer, primary_key=True, autoincrement=True)
        title = Column(String(190), index=True)
        timestamp_utc = Column(DateTime)
        __table_args__ = (Index("ix_title", "title", mysql_length=30),)
    

    您可以将前缀大小(在本例中为 30)调整为适用于您的特定用例的值。 请注意,您必须使用 mysql_length 而不是 postgresql_prefix

    这会在“title”列的前 30 个字符上创建一个索引,这应该允许您在索引该列的同时保持在 MySQL 的最大索引大小限制内。

    【讨论】:

      猜你喜欢
      • 2013-07-11
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多