Django a PostgreSQL array – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Django a PostgreSQL array – Python – Fórum – Programujte.comDjango a PostgreSQL array – Python – Fórum – Programujte.com

 

sleepy
~ Anonymní uživatel
422 příspěvků
27. 4. 2014   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 158.195.196.–
sputnikone+1
Věrný člen
28. 4. 2014   #2
-
0
-

#1 sleepy
No, kde začít.

První věcí bude používání SQL, respektive jeho používání v metodách modelu. Tebou použité metody (které jsou pravděpodobně nepotřebné) by se měli nacházet spíše v manageru, než v modelu.

Další věcí je, proč chceš pro tenhle problém použít Postgres Array. Z hlediska ORM se toto dá řešit mnohem lépe pomocí dvou modelů a ManyToMany vztahu. Jako četbu bych doporučil http://www.craigkerstiens.com/2012/11/06/django-and-arrays/. Jinak s čím si neuspěl v djorm-ext-pgarray, vypadá to, že v kombinaci s djorm-ext-extensions dokáže Djanog ORM docela pěkně "přechcat".

Nahlásit jako SPAM
IP: 89.103.91.–
sleepy
~ Anonymní uživatel
422 příspěvků
28. 4. 2014   #3
-
0
-

Array chcem preto ze dana vec sa ma spravat ako array stringov a nic viac, cize nechcem dalsi model.

Dakujem za inofmacie, z casti mi pomohli. Metody som presunul do extendnuteho FilterQuerySet-u, aby som ich mohol pouzivat s metodami QuerySet-u. Funguje to ked pole zadam pri vytvoreni modelu. Ale stale nefunguje update tam mi to pri testoch vzdy failne, ako keby sa nove hodnoty v poli vobec nezmenili.

skusal som to dvomi sposobmi oba zlihali:

class FilterQuerySet(models.query.QuerySet):
	
	def add_rules(self, array, tags=[]):
		# check toho ci su hodnoty spravne
		tags = set(tags)
		for flt in self.all():
			flt_tags = set(getattr(flt, array))
			new_tags = list(flt_rules | tags)
			kwargs = {array: new_tags,}
			self.filter(pk=flt.pk).update(**kwargs)

# a podobne aj
	def add_rules(self, array, tags=[]):
		#check
		tags = set(tags)
		for flt in self.all()
			flt_tags = set(getattr(flt, array))
			new_tags = list(flt_rules | tags)
			setattr(flt, array, new_tags)
			flt.save()


v oboch pripadoch rovnaky vysledok testu ktory mal pridat pole: ['foo', 'bar', 'baz'] !=[].

Ale ak som Filter vytvoril s timito poliami tak tam boli, taktiez testovane.

Nahlásit jako SPAM
IP: 158.195.196.–
sleepy
~ Anonymní uživatel
422 příspěvků
28. 4. 2014   #4
-
0
-

Velmi sa ospravedlnujem som debil :D. Som si updatol databazu, ale stale som mal referenciu na povodny objekt s neupdate-nutimi poliami. Uz mi to bezi.

Nahlásit jako SPAM
IP: 158.195.196.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

PostgreSQL — založil Judegar

Hibernate a postgresql — založil Lubo

MySQL nebo PostgreSQL — založil JirkaMan

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý