У меня есть столбец в моей базе данных под названием coordinates
, теперь столбец координат содержит информацию о диапазоне времени, которое объект занимает в моем графике. Я хочу разрешить пользователю фильтровать по дате, но проблема в том, что я использую функцию для определения даты в обычном режиме. Возьмите:Применить функцию к столбцу перед фильтрацией
# query_result is the result of some filter operation
for obj in query_result:
time_range, altitude_range = get_shape_range(obj.coordinates)
# time range for example would be "2006-06-01 07:56:17 - ..."
Теперь, если я хочу, чтобы фильтровать по дате, я бы хотел, чтобы это like
:
query_result = query_result.filter(
DatabaseShape.coordinates.like('%%%s%%' % date))
Но проблема, я в первую очередь необходимо обратиться get_shape_range
к coordinates
для того, чтобы получить строка. Есть ли способ сделать ... Я предполагаю операцию transform_filter? Такое, что до like
, я применяю некоторую функцию для координат? В этом случае мне нужно будет написать функцию get_time_range
, которая вернула только время, но вопрос остается тем же.
EDIT: Вот мой класс базы данных
class DatabasePolygon(dbBase):
__tablename__ = 'objects'
id = Column(Integer, primary_key=True) # primary key
tag = Column(String) # shape tag
color = Column(String) # color of polygon
time_ = Column(String) # time object was exported
hdf = Column(String) # filename
plot = Column(String) # type of plot drawn on
attributes = Column(String) # list of object attributes
coordinates = Column(String) # plot coordinates for displaying to user
notes = Column(String) # shape notes
lat = Column(String)
@staticmethod
def plot_string(i):
return constants.PLOTS[i]
def __repr__(self):
"""
Represent the database class as a JSON object. Useful as our program
already supports JSON reading, so simply parse out the database as
separate JSON 'files'
"""
data = {}
for key in constants.plot_type_enum:
data[key] = {}
data[self.plot] = {self.tag: {
'color': self.color,
'attributes': self.attributes,
'id': self.id,
'coordinates': self.coordinates,
'lat': self.lat,
'notes': self.notes}}
data['time'] = self.time_
data['hdfFile'] = self.hdf
logger.info('Converting unicode to ASCII')
return byteify(json.dumps(data))
и я использую SQLite 3.0. Причина, по которой большинство вещей - это строки, состоит в том, что большинство моих значений, которые должны быть сохранены в базе данных, отправляются как строки, поэтому сохранение является тривиальным. Мне интересно, должен ли я все это разыгрывать магию с функциями до и просто иметь больше записей в базе данных? такие вещи, как десятичного time_begin, time_end, latitude_begin вместо того, чтобы иметь строку, содержащую диапазон времени что я анализирую найти time_begin и time_end когда я буду фильтровать
Я думаю, что лучше всего было бы сделать скоординировать как класс и сделать его в качестве элемента базы данных, там вы можете добавлять методы, которые вы хотите по координатам, не вызывая изменение базы данных, например DatabaseShape.coordinates.get_shape_range – Eliethesaiyan
@Eliethesaiyan, если бы я сделал класс элементом моей базы данных, я мог бы сделать что-то вроде «DatabaseShape.coordinates». get_shape_range.like ('дата') '? Но не get_shape_range возвращает строку в моем случае, поэтому вы не можете просто использовать '.like' на ней? –
Какую базу вы используете? Как выглядит содержимое «координат», это строка? –