【问题标题】:one field with different data types [SQLAlchemy]一个具有不同数据类型的字段 [SQLAlchemy]
【发布时间】:2010-07-02 17:28:06
【问题描述】:

我有一个可以是整数、浮点数或字符串的值,并且我创建了不同的列:

#declarative
class MyClass(Base):

    #id and other Columns
    _value_str = Column(String(100))
    _value_int = Column(Integer)
    _value_float = Column(Float)

    def __init__(self,...,value):
        self._value_str = value if isinstance(value,(str,unicode)) else None
        self._value_int = value if isinstance(value,int) else None
        self._value_float = value if isinstance(value,float) else None

我想做这样的事情:

>>> value = 'text'
>>> my_class = MyClass(value, ...)
>>> my_class.value
>>> 'text'
>>> session.add(my_class)
>>> session.commit()
#specialy this
>>> result = session.query(Myclass).filter(Myclass.value == 'text').one()
>>> print result.value 
>>> 'text'

也许我有设计问题,我接受任何好主意

我是 SQLAlchemy 的新手

谢谢

【问题讨论】:

    标签: python database-design sqlalchemy


    【解决方案1】:

    可能是设计问题 - 您的数据库和 Python 之间有点不匹配。 SQL 中的变量(列)具有类型,而 Python 中的值具有类型。

    一种可能性是使用单个列(字符串),但在存储之前腌制值。

    这可以通过sqlalchemy custom type 自动完成。

    类似于以下内容(使用 jsonpickle 进行转换而不是 cpickle):

    import sqlalchemy.types as types
    import jsonpickle
    from copy import deepcopy
    
    class JsonType(types.MutableType, types.TypeDecorator):    
        impl = types.Unicode
    
        def process_bind_param(self, value, engine):
            return unicode(jsonpickle.encode(value))
    
        def process_result_value(self, value, engine):
            if value:
                rv = jsonpickle.decode(value)
                return rv
            else:
                return None
    
        def copy_value(self, value):
            return deepcopy(value)
    
        def compare_values(self, x, y):
            return x == y
    

    然后按如下方式使用:

    class MyClass(base):
        value = Column(JsonType())
    

    【讨论】:

    • grate!!,我一直在寻找类似的东西,但文档真的很糟糕,谢谢
    • 看,你可能感兴趣,这是一个使用 MapperExtention stackoverflow.com/questions/3020394/…的选项
    • 请注意这个答案,您不能使用 db 函数,例如sum() 在您存储的任何浮点数或整数上。这些文档实际上非常适合使用 SQLAlchemy - 它们必须涵盖很多领域 - 但是是的,可以使用更多真实世界的示例。
    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2018-02-28
    相关资源
    最近更新 更多