Форум сайта python.su
Вопрос наверное не только про Джангу а про бд(mysql) вообще, хотя может джанга какие то свои особенности проявляет.
Есть список в бд (который видимо хранится в строковом типе поля). К нему периодически в определенные по индексу места будут добавляться новые элементы, какие-то будут удаляться. Существуют ли методы делать это быстрее чем заново переписывать всё поле каждый раз? Если такие методы существуют, какой с ними выигрыш в скорости?
Офлайн
Зачем делать такое “изящество” в виде хранения списка в виде строки? В подобном случае вы не сможете по нему нормально фильтровать записи и делать кучу других действий.
Как вариант предлагаю либо завязаться на конкретной СУБД в частности PostgreSQL и использовать его PGArray: https://www.djangopackages.com/grids/g/arrayfield/
либо чтобы не завязываться на конкретную СУБД сделать отдельную модель у которой будет ссылка на модель в которой вы собирались хранить список в строковом представлении а также нужные вам поля к примеру id.
Отредактировано alafin (Фев. 27, 2013 10:12:10)
Офлайн
alafinАга я про это и спрашивал. То есть нет такого способа общения с полем в mysql как с обычным списком. Про array в PostgreSQL слышал, для mySql не встречали такого?
В подобном случае вы не сможете по нему нормально фильтровать записи и делать кучу других действий.
alafinЕсли я вас правильно понял, у меня все так и есть. Есть модель в которая и хранит такие списки в строковом состоянии. Каждый раз обращаясь к определенному полю с целью проучить из строки фрагмент, или записать фрагмент туда, требуется прежде извлечь строку, изменить ее, затем снова записать в поле. Я интересуюсь способ редактировать содержимое строки, не извлекая её всю. Предложенный вами способ не позволяет так делать. Или я вас не правильно понял
сделать отдельную модель у которой будет ссылка на модель в которой вы собирались хранить список в строковом представлении
Офлайн
Зачем список то?
class Foo(Model): name = CharField(....) class List(Model): list_item = CharField(....) # Или ItegerField или любой другой Field foo = ForeignKey(Foo)
foo = Foo.objects.get(name='bla-bla')) lst = List.objects.filter(foo=foo) # Список new_item = List.objects.create(foo=foo, list_item='new_record') # Добавляем new_item.list_item='newest' new_item.save()# Изменяем List.objects.get(foo=foo, list_item='new_record').delete() # Удаляем
Офлайн
да я понимаю,что так правильно, в базах данный все так и происходит. а со списком вообще не правильно. но вопрос то именно такой - найти способ взаимодействия с одним полем(не знаю уже какого типа) не извлекая его полностью, а не создавать новые поля. если кому, что на ум придет, поделитесь пожалуйста.
Офлайн
ИМХО это бред.
Офлайн
kvadratMySQL такого не умеет.
но вопрос то именно такой - найти способ взаимодействия с одним полем(не знаю уже какого типа) не извлекая его полностью
Офлайн
FishHook
Зачем список то?
class Foo(Model):
name = CharField(….)
class List(Model):
list_item = CharField(….) # Или ItegerField или любой другой Field
foo = ForeignKey(Foo)
Собственно, вот и весь список. Добавляйте, удаляйте, делайте что угодно без извращений.
class List(Model): item = CharField(....)
Офлайн
kvadratНет, вы меня не правильно поняли, я имел в виду вариант который был предложен FishHook а именно:
Если я вас правильно понял, у меня все так и есть.
class Foo(Model): name = CharField(....) class List(Model): list_item = CharField(....) # Или ItegerField или любой другой Field foo = ForeignKey(Foo)
Офлайн
всё понял. бд такого не может. спасибо за ответы
Офлайн