gpt4 book ai didi

python - 具有不同数据类型的一个字段 [SQLAlchemy]

转载 作者:行者123 更新时间:2023-12-01 06:16:22 27 4
gpt4 key购买 nike

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

#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 之间有点不匹配。在 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())

关于python - 具有不同数据类型的一个字段 [SQLAlchemy],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3167842/

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