gpt4 book ai didi

python - 在 sqlalchemy 的 ORM(postgresql 数据库)中自动截断字符串

转载 作者:行者123 更新时间:2023-12-05 01:32:18 34 4
gpt4 key购买 nike

如何在不为每个属性显式定义 @validates 方法的情况下自动截断数据模型中的多个属性的字符串值?

我当前的代码:

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import validates

class MyModel:
__tablename__ = 'my_model'

id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(40), nullable=False, unique=True)

# I can "force" truncation to my model using "validates"
# I'd prefer not to use this solution though...
@validates('name')
def validate_code(self, key, value):
max_len = getattr(self.__class__, key).prop.columns[0].type.length
if value and len(value) > max_len:
value = value[:max_len]
return value

我担心的是我的 ORM 将跨越许多表和字段,并且在字符串长度验证中包含属性时存在很高的疏忽风险。简而言之,我需要一个可以扩展的解决方案。 理想情况下,我的 session 配置中的一些东西会自动截断太长的字符串...

最佳答案

你可以 create a customised String type在插入时自动截断其值。

import sqlalchemy.types as types


class LimitedLengthString(types.TypeDecorator):
impl = types.String

def process_bind_param(self, value, dialect):
return value[:self.impl.length]

def copy(self, **kwargs):
return LimitedLengthString(self.impl.length)


class MyModel:
__tablename__ = 'my_model'

id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(LimitedLengthString(40), nullable=False, unique=True)

扩展类型仍会在数据库中创建 VARCHAR(40),因此应该可以将 String(40) 替换为 LimitedLengthString(40) * 在您的代码中,无需数据库迁移。


* 您可能想选择一个较短的名称。

关于python - 在 sqlalchemy 的 ORM(postgresql 数据库)中自动截断字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65636756/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com