У меня есть значение, которое может быть целым числом, плаванием или строкой, и я создал различные столбцы:
#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'
Возможно, у меня есть проблема проектирования, я соглашаюсь с любой хорошей идеей
Я - newbe в SQLAlchemy
Спасибо
Вероятно, проблема в дизайне - небольшое несоответствие между вашей БД и Python. В SQL переменные (столбцы) имеют тип, тогда как в Python значения имеют тип.
Один из возможных вариантов - использовать один столбец (строку), но при этом сохранить значение перед его сохранением.
Это может быть выполнено автоматически с помощью пользовательского типа sqlalchemy .
Что-то вроде следующего (для преобразования используется 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())