sqlalchemy orm列名约定

2024-05-18 11:16:48 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将表单my_column的所有字段自动映射到数据库中相应的列MyColumn?在

class MyTable(Base):
    __tablename__ = 'MyTable'
    # what I have now:
    my_column_1 = Column('MyColumn1', Integer)
    # what I want: how to configure a convention mapping rule for this:
    my_column_1 = Column(Integer)

Tags: 数据库表单basemyhavemytablecolumninteger
1条回答
网友
1楼 · 发布于 2024-05-18 11:16:48

在将控制权传递给DeclarativeMeta之前,您可以提供自己的重命名列的元类。另一个选择是为^{}更改^{}事件处理程序中的列名,但这将全局地影响所有列,而不仅仅是使用特定声明性基的映射类中的列。在

from sqlalchemy.ext.declarative.api import DeclarativeMeta
from sqlalchemy import Column

class RenamingDeclarativeMeta(DeclarativeMeta):
    def __init__(cls, name, bases, namespace):
        _rename_declared_columns(namespace)
        super().__init__(name, bases, namespace)

    def __setattr__(cls, key, value):
        if isinstance(value, Column):
            _undefer_column_name_only(key, value)
        super().__setattr__(key, value)

def to_camelcase(s):
    return ''.join([w.title() for w in s.split('_')])

def _undefer_column_name_only(key, column):
    if column.name is None:
        column.name = to_camelcase(key)

def _rename_declared_columns(namespace):
    for key, attr in namespace.items():
        if isinstance(attr, Column):
            _undefer_column_name_only(key, attr)

这省略了一些功能,例如重命名ColumnPropertyCompositeProperty属性中包含的列。要使用它,请将其作为^{}传递给^{}

^{pr2}$

另一种方法是使用event API全局重命名附加到^{}对象的所有列:

from sqlalchemy import event

@event.listens_for(Column, 'before_parent_attach')
def receive_column_before_table_attach(column, table):
    # As dumb as it gets. Blindly modifies all columns.
    column.name = to_camelcase(column.name)

这有一个主要的缺点:它还会盲目地重命名反射表中的列,这就是为什么我建议使用元类方法。这是更好的控制和更少的惊讶。在

相关问题 更多 >