如何控制SQLAlchemy中继承列的顺序?

Fil*_* N. 6 python sqlalchemy

我已经增强了基类,因此它创建了我的项目中所有表中使用的列。但是,我想在数据库中创建表时控制列的顺序,以便该DWH_ID列是表中的第一列,而在基类中创建的所有其他列是表的最后一列。

假设我的项目定义如下:

from sqlalchemy import CHAR, Column, create_engine, DateTime, Integer, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import func

class Base:

    __table_args__ = {'schema': 'some_schema'}

    dwh_id = Column(Integer, primary_key=True, autoincrement=True, comment='Surrogate key')
    dwh_date_inserted = Column(DateTime(timezone=False), default=func.now(), nullable=False, comment='Date and time when the record has been inserted')
    dwh_date_updated = Column(DateTime(timezone=False), nullable=True, comment='Date and time when the record has been updated')
    dwh_is_active = Column(CHAR(1), default='Y', nullable=False, comment="'Y' if the record is still available in the source, 'N' otherwise")

engine = create_engine(SOME_CONNECTION_STRING)
Base = declarative_base(cls=Base)

class Person(Base):

    __tablename__ = 'persons'

    first_name = Column(Text(), nullable=False, comment="First name of the person")
    last_name = Column(Text(), nullable=False, comment="Last name of the person")

Base.metadata.create_all(engine, checkfirst=True)
engine.dispose()
Run Code Online (Sandbox Code Playgroud)

创建的表如下所示:

dwh_id | dwh_date_inserted | dwh_date_updated | dwh_is_active | first_name | last_name
---------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我想要这样的列顺序:

dwh_id | first_name | last_name | dwh_date_inserted | dwh_date_updated | dwh_is_active
---------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我在文档中找不到任何有用的内容。任何帮助表示赞赏。

小智 1

In sqlalchemy 2.0+ you can easy do it with the sort_order parameter of mapped_column.

SQLAlchemy docs