V postgreSQL je možné do jedné buňkky uložit pole integerů (řetězců, dat, atd…) nette database ale vrací jen

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
zac24
Člen | 41
+
0
-

V postgreSQL je možné do jedné buňkky uložit pole integerů (řetězců, dat, atd…) nette database ale vrací jen retezec ve kterem je toto pole zakodovano stylem „{1,2,3,4,5}“ místo aby podle očekávání vrátilo skutečné php pole eventuálně objekt arrayhash. Nenapadá vás prosím jak toho chování docílit, protože jinak je práce s těmito typy buňek dost nepřehledná a je třeba si dopisovat matody na jejich transformaci z/do pole. Možná jen něco přehlížím.

h4kuna
Backer | 740
+
0
-

V tuto chvíli není implementováno a všechna pole jsou vracena jako řetězec.

CZechBoY
Člen | 3608
+
0
-

Ono to je trochu složitější asi.
Když budu vybírat konkrétní hodnotu, třeba sloupec[0] tak by se to mělo otypovat jako integer.
Když budu mít pole polí integerů a vyberu sloupecInt[0] tak by se to zase mělo otypovat jako pole a rozparsovat v php.

Je vůbec v NDT možný mít „název“ sloupce obsahující hranatý závorky? Potom by se samozřejmě dalo zjistit jakej typ to nakonec má mít.

Jinak pokud by sis to chtěl doplnit/poslat PR tak bude potřeba ještě změnit (minimálně) ResultSet::normalizeRow.

Editoval CZechBoY (22. 1. 2016 15:09)

h4kuna
Backer | 740
+
0
-

Ono je lehký zjistit typ. Protože ty typy co vrací postgres jsou prefixovaný podtržítkem a tím říká že je to pole. Int, float, datetime půjde v pohodě ale nejhorší bude string. A mít poloviční podporu asi nikdo nechce. A taky můžeš mít zanořený pole.

Editoval h4kuna (22. 1. 2016 20:10)

CZechBoY
Člen | 3608
+
0
-

Jo, ale když např selectnu pole[0] tak mi to žádnej typ nevrátí, ne? Nebo mi něco uchází?
Dokážu si zjistit strukturu tabulky, ale asi ne co mi vrátí databáze jako result set.
Jedině potom na základě počtu hranatých závorek v „názvu“ sloupce a základního datovýho typu sloupce.

h4kuna
Backer | 740
+
0
-

Meta informace které jsou vytaženy při selectu.

array (6)
   "pgsql:oid" => 1015
   native_type => "_varchar" (8)
   name => "list_string" (11)
   len => -1
   precision => -1
   pdo_type => 2

Takže to „pgsql:oid“ definuje datový typ, což bude asi bitový pole a nějaký bit bude říkat že se jedná o pole. Nicméně „native_type“ pokud začíná podtržítkem tak je to pole.

To pole obsahující stringy může vypadat všelijak. Takže nejde použít explode, str_getcsv, nahradit kudrnatý závorky hranatými, udělat z toho php pole a prohnat eval, ani token_get_all si s tím neporadí a je potřeba napsat kolem toho víc.

Kdyby šlo donutit postgres, aby vždy vracel stringy v poli obalené do uvozovek, tak by to šlo už něčím prohnat. Jediný co jsem našel ze postgre 9.2+ umí převést svoje pole na json a z toho udělat přes json_decode objekt nebo php pole. Ale zase se musí myslet na to že to při selectu musíš obalit a to bude kámen úrazu.

Editoval h4kuna (23. 1. 2016 13:17)

iguana007
Člen | 970
+
0
-

A nebylo by možná lepší/jednodušší použít JSON type? http://www.postgresql.org/…pe-json.html

h4kuna
Backer | 740
+
0
-

Aktuální je ještě verze 9.1, kde json není. Myslím to z hlediska že se to asi do frameworku nehodí přidat. Autor si může sám udělat podporu pro json.

Editoval h4kuna (18. 2. 2016 6:24)