Dobry den,
chcel by som sa opytat ci ste niekto neriesili, pripadne neviete ako vyriesit problem s vkladanim elementov do PostgreSQL pola. Som si troska cital o PostgreSQL a zapacilo sa mi zopar ficur, ktore ponuka. Ale mam velky problem s vlozenim elementu do pola v databaze. Mohol by som to riesit aj inymi sposobmi, ale na co ked je tam datovy typ pola. Skusal som aj projekty djorm_pgarray aj dbarray, ale neuspesne. Tak ze sa to teraz snazim vkladat rucne.
Teraz to skusam, tak som si vytvoril model Filter, ktory drzi pole tagov a mam Message, ktory obsahuje taktiez list tagov. Ked sa niektore tagy zhoduju, tak od toho odcakavam ze mi to vrati True v opacnom pripade False.
Nechce sa mi tu davat cely kod, ale dam sem aspon tu cast o ktorej si myslim, ze je dolezita:
class Message:
tags = list() # list tagov tie sa pridavaju pri inicializacii a su kontrolovane
# tu chyba nebude tento objekt zbehol testami
# dalsie fieldy a metody
# messages/models.py
from djorm_pgarray.fields import ArrayField
from django.db impot models, connection
class Filter(models.Model):
# fieldy
tags = ArrayField(dbtype='char(32)')
def add_tag(self, element):
sql = """UPDATE %s SET %s = array_append(%s, '%s') WHERE id=%s;"""
sql = sql % (self._meta.db_table, 'tags', 'tags', element, self.id)
cursor = connection.cursor()
cursor.execute(sql)
# ked som tuto metodu testoval a dal som si vytiahnut pole
# pomocou napr. SELECT tags FROM messages_filter WHERE id=1
# cez cursor.execute(sql) a cursor.fetchone() tak som dostal prvy tag
# a test zbehol.
# dalsie metody
def overlap(self, message):
# v skutocnosti mam na toto vytvoreny builder, aby som mohol
# vyuzivat troska viac veci. Ale bol testovany v nom by problem byt
# nemal.
sql = """SELECT (SELECT %s FROM %s WHERE id=%s) && %s"""
sql = sql % (
'tags',
self._meta.db_table,
self.id,
PostgresArrayBuilder(message.tags, 'char(32)').as_psql_array()
)
# PostgressArrayBuilder v podstate urobi z hocicoho iterovatelneho
# ARRAY a overy ze su v tom iterovatelnom objekte spravne parametre.
# ['tag1', 'tag2', 'tag3'] -> "ARRAY['tag1', 'tag2', 'tag3']::char(32)"
cursor = connection.cursor()
cursor.exceute(sql)
return cursor.fetchone()[0] # a tu mi to za kazdym vrati null
# a tym padom mi test pre tuto metodu
# failol.
S postgresql som len zacal robit, tak ze este velmi neviem v com moze byt problem. Ale ked som si dane prikazy skusal len tak v db tak to fungovalo. Moze byt nejaky problem s django.db.connection-om? Engine mam v settingsoch nastaveny na: 'django.db.backends.postgresql_psycopg2'. Vela som googlil a to co som nasiel mi velmi nepomohlo. Ak budete mat niekto nejake navrhy, prip. viete kde robim chybu, tak vam voperd dakujem za vasu odpoved.