返回

SQLAlchemy 中处理以双下划线开头的列名的最佳实践

python

处理 SQLAlchemy 中以双下划线开头的列名

在使用 SQLAlchemy 时,处理以双下划线开头的列名会遇到一些困难。这是因为 SQLAlchemy 的默认名称转换规则会将以双下划线开头的列名转换为小写,并在开头添加一个下划线。例如,一个名为 __has_error__ 的列将被转换为 _has_error

为了避免这种情况,我们可以使用 SQLAlchemy 的 __table_args__ 参数来指定自定义的命名转换函数。这个参数可以让我们灵活地定义列名的转换规则,从而满足我们的特定需求。

from sqlalchemy import Boolean, Column, Identity, Integer
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base

Base = declarative_base()

class Tbl(Base):
    __tablename__ = 'Tbl'
    __table_args__ = {'naming_convention': {'regex': r'__.*__', 'fn': lambda match: match.group(0)[1:]}}
    __has_error__ = Column(Boolean)
    id = Column(Integer, primary_key=True, server_default=Identity())

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

在上面的示例中,__table_args__ 参数指定了一个自定义的命名转换函数,该函数将以双下划线开头的列名转换为小写,而不添加额外的下划线。这样,我们的列名 __has_error__ 将被正确地保留为 __has_error__

通过这种方法,我们可以灵活地处理以双下划线开头的列名,并确保它们在数据库中以我们期望的方式出现。

常见问题解答

  1. 为什么需要自定义命名转换函数?

默认情况下,SQLAlchemy 将以双下划线开头的列名转换为小写并添加下划线前缀。为了保留这些列名的原始形式,我们需要使用自定义命名转换函数。

  1. 如何定义自定义命名转换函数?

自定义命名转换函数是一个 lambda 函数,它接受一个匹配对象作为参数,并返回转换后的列名。我们可以使用正则表达式来匹配要转换的列名。

  1. 如何使用 __table_args__ 参数?

__table_args__ 参数是一个字典,它允许我们指定表的附加属性,包括自定义命名转换函数。我们可以使用 naming_convention 子字典来定义命名转换规则。

  1. 除了列名之外,自定义命名转换函数还可以应用到其他地方吗?

是的,自定义命名转换函数不仅适用于列名,还可以适用于表名、约束名和其他元数据元素。

  1. 我应该始终使用自定义命名转换函数吗?

不一定。只有在需要保留以双下划线开头的列名的原始形式时才需要使用自定义命名转换函数。在其他情况下,可以使用 SQLAlchemy 的默认命名转换规则。