【问题标题】:Create a table using SQLAlchemy, but defer the creation of indexes until the data is loaded使用 SQLAlchemy 创建表,但将索引的创建推迟到数据加载完成
【发布时间】:2014-10-01 10:40:50
【问题描述】:

我有一个 python 文件,它使用 SQLAlchemy 定义给定数据库中的所有表,包括所有适用的索引和外键约束。 该文件如下所示:

Base = declarative_base()

class FirstLevel(Base):
    __tablename__ = 'first_level'
    first_level_id = Column(Integer, index=True, nullable=False, primary_key=True, autoincrement=True)
    first_level_col1 = Column(String(100), index=True)
    first_level_col2 = Column(String(100))
    first_level_col3 = Column(String(100))

class SecondLevel(Base):
    __tablename__ = 'second_level'
    second_level_id = Column(Integer, index=True, nullable=False, primary_key=True, autoincrement=True)
    first_level_id = Column(None, ForeignKey(FirstLevel.first_level_id, onupdate='cascade', ondelete='cascade', deferrable=True), index=True, nullable=False)
    second_level_col1 = Column(String(100), index=True)
    second_level_col2 = Column(String(100))
    second_level_col3 = Column(String(100))

class ThirdLevel(Base):
    __tablename__ = 'third_level'
    third_level_id = Column(Integer, index=True, nullable=False, primary_key=True, autoincrement=True)
    first_level_id = Column(None, ForeignKey(FirstLevel.first_level_id, onupdate='cascade', ondelete='cascade', deferrable=True), index=True, nullable=False)
    second_level_id = Column(None, ForeignKey(SecondLevel.second_level_id, onupdate='cascade', ondelete='cascade', deferrable=True), index=True, nullable=False)
    third_level_col1 = Column(String(100), index=True)
    third_level_col2 = Column(String(100))
    third_level_col3 = Column(String(100))

...

我可以使用这个文件通过执行以下命令在 postgres 数据库中创建一个新模式:

engine = create_engine('postgresql://username:password@path_to_database')
Base.metadata.create_all(engine)

问题是我必须将大量数据加载到这个新创建的数据库中,如果我不删除索引和外键约束,这需要很长时间。但是在我插入所有数据后手动删除和重新创建它们是一个很大的麻烦,并且消除了使用 SQLAlchemy 创建数据库模式的大部分便利。

我想知道是否有一种方法可以使用 SQLAlchemy 首先在数据库中创建表,加载数据,然后再次使用 SQLAlchemy ORM 来创建所有索引和外键约束?

【问题讨论】:

    标签: python database postgresql pandas sqlalchemy


    【解决方案1】:

    您可以使用 Alembic 迁移脚本来实现。

    1. 创建初始表/删除现有索引
    2. 加载数据
    3. 添加索引

    【讨论】:

    • 您能详细说明一下吗?您将如何根据元数据删除现有索引?您将如何重新添加它们? (理想情况下,我会创建没有索引的初始表......因为 sqlite 不能删除索引:/)。
    • @KaolinFire - Alembic 在alembic.operations.Operations 下有create_indexdrop_index 方法。
    猜你喜欢
    • 2017-12-02
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2021-10-01
    • 2020-10-09
    • 2021-02-21
    相关资源
    最近更新 更多