Форум сайта python.su
Вот захотел нарисовать табличку до сих пор работал с posgresql и как то не думал что возникнут вопросы. В любом view получаются документы целиком или какие то части документов но в виде key-value, а как получить только все ключи или только все значения? Чтоб ключами обозначить названия колонок а значениями собственно содержимое колонок.
Все что пришло в голову это или каждому ключу присваиваться несколько значений или скажем для шапки таблички создавать один документ а для тела таблички остальные ну или что то типа регулярных выражений и тд. но хочется как то элегантней что ли, может сказуется отсутствие опыта работы с видами или может есть какие то механизмы.
Отредактировано (Ноя. 20, 2010 01:43:52)
Офлайн
alexandreВсё зависит от того как вы этот view напишите.
В любом view получаются документы целиком или какие то части документов но в виде key-value,
alexandreЗависит от того “ключ” и “значение” чего вы хотите получить.
а как получить только ключи или только значения
alexandreЗапрос возвращает генератор и у вас не получится так просто пройтись по нему несколько раз
<thead><tr> {% for doc_list in data %}<td> {{doc_list.key}}<td> {% endfor %}</tr></thead> <tbody><tr> {% for doc_list in data %}<td> {{doc_list.value}}<td><br/> {% endfor %}</tr></thead>
alexandreВ вашем случае вы возвращаете в качестве ключа весь документ, а в качестве значения ничего. Очень странно.
res = db.query(map_fun)
Офлайн
Я имел в виду что скажем есть 10 документов с одинаковыми ключами и разными значениями и получить ключи любого документа, чтоб вывести в шапке таблички, а в теле только значения всех документов как то так.
И еще вопрос можно ли как то сюда
map_fun = ''' function(doc) { if(doc.title) emit(doc.title, null);} '''
name = doc.title
map_fun = ''' function(doc) { if(name) emit(doc.title, null);} '''
Офлайн
Например я хочу показать для заголовка, поля с ключами show_title, show_descr, и др. те где есть show_ это можно как то сделать с помощью одного запроса view?
Отредактировано (Ноя. 20, 2010 16:38:16)
Офлайн
Немного некорректный вопрос был насколько я сейчас понял в map не подключиш динамически ничего, он нужен только для создания определеного индекса. Попробую переформулировать вопрос:
Есть список документов типа
{
"_id": "1",
"_rev": "4-f21208abd11a9e2c18629325789e0578",
"show_title": "земля Санникова",
"ISBN": ["567-5-237-01677-4" ],
"show_genre": "фантастика",
"show_price": 100,
"author": "первый",
"type": "book"
}
rpt_view = ViewDefinition('rb', 'show', '''function(doc) {if(doc._id=="1") emit(doc, doc); }''')
rpt_view.sync(db)
for res in db.view("_design/rb/_view/show", keys=["show_title", "show_genre", "show_price"]):
print res.key
print res.value
Отредактировано (Ноя. 21, 2010 15:58:40)
Офлайн
:)
мап функцию можно изменять динамически, правда не подскажу как это повлияет на производительность но сделать что-то вроде такого можно:
map_func = '''
function (doc) {
if (doc._id == '%s')
emit(doc._id, null)
}'''
for row in db.query(map_func % '1'):
print row
doc = db['1']
print doc['show_title']
Офлайн
ofigetitelnoмап функцию НЕЛЬЗЯ изменять динамически.
мап функцию можно изменять динамически
Офлайн
:)
да что вы говорите…
нельзя - это, в смысле, не рекомендовано или не будет работать?
потому как работает…
Офлайн
Работает, пересоздавая индекс. Накладно выходит.
Офлайн
Да собственно постоянный а не временный вид и нужен чтоб не пересоздавался, все таки при пересоздании он по всей базе проходиться, если это частый запрос то это создаст определенные тормоза наверно. Поэтому напрашиваеться вариант с получением просто документа а дальше его уже с помощью регулярных выражений обрабатывать.
Офлайн