ΠΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π½ΡΠΆΠ΄Π° Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈΠ»ΠΈ Π΄ΠΎΡΠΈ ΡΡΠ»Π° ΠΈΠ·Π²Π°Π΄ΠΊΠ° Π½Π° 'Π²Ρ
ΠΎΠ΄Π°'. ΠΠΎΠ½ΡΠΊΠΎΠ³Π° ΡΠ΅ ΡΡΠ΅ΡΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ°Π½Π½ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π° ΡΠ°Π·ΠΈ Π·Π°Π΄Π°ΡΠ°.

ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ 'ΠΎΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ' ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ, Π·Π°ΡΠΎ ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅.
ΠΡΡΠΊΠ° 'Π²ΡΠ΅Π·ΠΊΠ°' Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π² ΡΡΠ»ΠΎΡΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°
ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»Π½ΠΎ ΡΠ°ΠΊΠ°:
query = "SELECT * FROM tbl WHERE id = " + value... ΠΈΠ»ΠΈ ΡΠ°ΠΊΠ°:
query = "SELECT * FROM tbl WHERE id = :param".format(param=value)ΠΠ° ΡΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π΅ ΠΊΠ°Π·Π°Π½ΠΎ, Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ ΠΈ Π² Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π°:

ΠΠΎΡΡΠΈ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠΎΠ²Π° Π΅β ΠΏΡΡΠΊ ΠΏΡΡ ΠΊΡΠΌ SQL ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΠΈ ΠΈ ΠΈΠ·Π»ΠΈΡΠ½ΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ Π½Π° Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ Π΅ ΠΏΡΠΈΠ½ΡΠ΄Π΅Π½Π° Π΄Π° 'Π·Π°Π»Π΅ΠΏΠ²Π°' ΡΡΡΠΈΠ½Π³Π° Π½Π° Π²Π°ΡΠ°ΡΠ° Π·Π°ΡΠ²ΠΊΠ°.
Π§Π°ΡΡΠΈΡΠ½ΠΎ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°ΠΌΠΎ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΎΡ ΡΠ΅ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ Π² Π²Π΅ΡΡΠΈΠΈ PostgreSQL 10 ΠΈ ΠΏΠΎ-Π΄ΠΎΠ»Ρ Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΠΎ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ ΠΏΠ»Π°Π½. Π ΡΠ΅Π·ΠΈ Π²Π΅ΡΡΠΈΠΈ ΡΠΏΠΈΡΡΠΊΡΡ Π½Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½ΠΈΡΠ΅ ΡΠ΅ΠΊΡΠΈΠΈ ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ Π±Π΅Π· Π΄Π° ΡΠ΅ Π²Π·ΠΈΠΌΠ°Ρ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΠΏΡΠ΅Π΄Π°Π²Π°Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΡΠ°ΠΌΠΎ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΡΡΠ»ΠΎΡΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°.
$n-Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ β ΡΠΎΠ²Π° Π΅ Π΄ΠΎΠ±ΡΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ , Π½Π°ΠΌΠ°Π»ΡΠ²Π°ΠΉΠΊΠΈ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ ΠΊΠ°ΠΊΡΠΎ Π½Π° Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° (ΡΡΡΠΈΠ½Π³ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΡΠ΅ ΡΠΎΡΠΌΠΈΡΠ° ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π° ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΠΏΡΡ), ΡΠ°ΠΊΠ° ΠΈ Π½Π° ΡΡΡΠ²ΡΡΠ° Π½Π° ΠΠ (Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΈ ΠΏΠ»Π°Π½ΠΈΡΠ°Π½Π΅ Π·Π° Π²ΡΠ΅ΠΊΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°).
ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ
ΠΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠ΅ Π½ΠΈ ΠΎΡΠ°ΠΊΠ²Π°Ρ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠΎΠΆΠ΅Π»Π°Π΅ΠΌ Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ:
... id IN ($1, $2, $3, ...) -- $1 : 2, $2 : 3, $3 : 5, ...ΠΠΊΠΎ ΠΎΡΡΠ°Π²ΠΈΠΌ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π² ΡΠΎΠ·ΠΈ Π²ΠΈΠ΄, ΡΡ ΡΠ΅ Π½ΠΈ ΠΏΡΠ΅Π΄ΠΏΠ°Π·ΠΈ ΠΎΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΈ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΠΈ, Π½ΠΎ Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΎΡ Π·Π°Π»Π΅ΠΏΠ²Π°Π½Π΅/ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π·Π° Π²ΡΠ΅ΠΊΠΈ Π²Π°ΡΠΈΠ°Π½Ρ ΠΎΡ Π±ΡΠΎΡ Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅.ΠΠ΅ΡΠ΅ Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π΄Π° ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈΠΌ ΠΈ Π±Π΅Π· ΡΠΎΠ²Π°.
ΠΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΅ Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ΠΌ ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΌΠ°ΡΠΈΠ²:
... id = ANY($1::integer[]) -- $1 : '{2,3,5,8,13}'ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π°ΡΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΡΠ²Π½ΠΎ Π΄Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°ΠΌΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π² Π½ΡΠΆΠ½ΠΈΡ ΡΠΈΠΏ ΠΌΠ°ΡΠΈΠ². ΠΠΎ ΡΠΎΠ²Π° Π½Π΅ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π·Π½Π°Π΅ΠΌ ΠΊΡΠ΄Π΅ Π°Π΄ΡΠ΅ΡΠΈΡΠ°ΠΌΠ΅.
ΠΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΈΠ·Π²Π°Π΄ΠΊΠ° (ΠΌΠ°ΡΡΠΈΡΠ°)
ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠΎΠ²Π° ΡΠ° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠΈ Π·Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠ½Π΅ Π½Π° Π½Π°Π±ΠΎΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ Π·Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ Π² Π±Π°Π·Π°ΡΠ° 'Ρ Π΅Π΄ΠΈΠ½ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅':
INSERT INTO tbl(k, v) VALUES($1,$2),($3,$4),...Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΎΡΠ²Π΅Π½ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΏΠΎ-Π³ΠΎΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ 'ΠΏΠ΅ΡΠ΅ΠΊΠ»Π΅ΠΉΠΊΠ°ΡΠ°' Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°, ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π½ΠΈ Π΄ΠΎΠ²Π΅Π΄Π΅ ΠΈ Π΄ΠΎ out of memory ΠΈ ΠΏΠ°Π΄Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΡΠ²ΡΡΠ°. ΠΡΠΈΡΠΈΠ½Π°ΡΠ° Π΅ ΠΏΡΠΎΡΡΠ° β ΠΏΠΎΠ΄ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅ PG ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠ° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΏΠ°ΠΌΠ΅Ρ, Π° Π±ΡΠΎΡΡ Π½Π° Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π² Π½Π°Π±ΠΎΡΠ° Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ ΡΠ°ΠΌΠΎ ΠΎΡ Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. Π ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΊΠ»ΠΈΠ½ΠΈΡΠ½ΠΈ ΡΠ»ΡΡΠ°ΠΈ ΡΠ΅ Π΅ Π½Π°Π»Π°Π³Π°Π»ΠΎ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ Β«Π½ΠΎΠΌΠ΅ΡΠ½ΠΈΒ» Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ Π½Π°Π΄ 9000 Π»Π². β Π½Π΅ ΡΡΡΠ±Π²Π° ΡΠ°ΠΊΠ°.
ΠΠ° ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π·Π°ΡΠ²ΠΊΠ°ΡΠ°, ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° Β«Π΄Π²ΡΡΡΠΎΠ²Π½Π°Β» ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ:
INSERT INTO tbl
SELECT
unnest[1]::text k
, unnest[2]::integer v
FROM (
SELECT
unnest($1::text[])::text[] -- $1 : '{"{a,1}","{b,2}","{c,3}","{d,4}"}'
) T;
ΠΠ°, Π² ΡΠ»ΡΡΠ°Ρ Ρ Β«ΡΠ»ΠΎΠΆΠ½ΠΈΒ» ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π² ΠΌΠ°ΡΠΈΠ²Π°, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΎΠ±Π³ΡΠ°Π΄Π΅Π½ΠΈ Ρ ΠΊΠ°Π²ΠΈΡΠΊΠΈ.
Π―ΡΠ½ΠΎ Π΅, ΡΠ΅ Ρ ΡΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Β«ΡΠ°Π·Π²ΠΈΠ΅Β» ΠΈΠ·Π±ΠΎΡΠ° Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Π±ΡΠΎΠΉ ΠΏΠΎΠ»Π΅ΡΠ°.
unnest, unnest, β¦
ΠΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎ ΡΠ΅ ΡΡΠ΅ΡΠ°Ρ Π²Π°ΡΠΈΠ°Π½ΡΠΈ Π½Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π²ΠΌΠ΅ΡΡΠΎ Β«ΠΌΠ°ΡΡΠΈΠ² ΠΎΡ ΠΌΠ°ΡΡΠΈΠ²ΠΈΒ» Π½ΡΠΊΠΎΠ»ΠΊΠΎ Β«ΠΌΠ°ΡΡΠΈΠ²ΠΈ ΠΎΡ ΠΊΠΎΠ»ΠΎΠ½ΠΈΒ», Π·Π° ΠΊΠΎΠΈΡΠΎ ΡΠΏΠΎΠΌΠ΅Π½Π°Ρ . :
SELECT
unnest($1::text[]) k
, unnest($2::integer[]) v;ΠΡΠΈ ΡΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄, ΠΊΠ°ΡΠΎ ΡΠ³ΡΠ΅ΡΠΈΡΠ΅ ΠΏΡΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠΏΠΈΡΡΡΠΈ ΠΎΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π½Π΅ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ, Π·Π°Π²ΠΈΡΠ΅ΡΠΈ ΠΈ ΠΎΡ Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ°:
-- $1 : '{a,b,c}', $2 : '{1,2}'
-- PostgreSQL 9.4
k | v
-----
a | 1
b | 2
c | 1
a | 2
b | 1
c | 2
-- PostgreSQL 11
k | v
-----
a | 1
b | 2
c |JSON
ΠΠ°ΠΏΠΎΡΠ²Π°ΠΉΠΊΠΈ Ρ Π²Π΅ΡΡΠΈΡ 9.3 Π² PostgreSQL, ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ Π° ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠΈΠΏΠ° json. ΠΠ°ΡΠΎΠ²Π°, Π°ΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π²Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π² Π±ΡΠ°ΡΠ·ΡΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΎ ΡΠ°ΠΌ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ json-ΠΎΠ±Π΅ΠΊΡ Π·Π° SQL-Π·Π°ΡΠ²ΠΊΠ°:
SELECT
key k
, value v
FROM
json_each($1::json); -- '{"a":1,"b":2,"c":3,"d":4}'ΠΠ° ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ ΡΡΡΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° each(hstore), Π½ΠΎ ΠΊΠΎΡΠ΅ΠΊΡΠ½Π°ΡΠ° Β«ΡΠ²Π΅ΡΡΠΊΠ°Β» Ρ Π΅ΠΊΠ·Π΅ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ Π² hstore ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ.
json_populate_recordset
ΠΠΊΠΎ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π·Π½Π°Π΅ΡΠ΅, ΡΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ Β«Π²Ρ ΠΎΠ΄Π½ΠΈΡΒ» json-ΠΌΠ°ΡΠΈΠ² ΡΠ΅ ΠΎΡΠΈΠ΄Π°Ρ Π·Π° Π·Π°ΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠΏΠ΅ΡΡΠΈΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈ Β«ΡΠ°Π·ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π΅ΡΠΎΒ» Π½Π° ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ° ΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ ΠΈΠΌ ΠΊΡΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΡΠΈΠΏΠΎΠ²Π΅, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° json_populate_recordset:
SELECT
*
FROM
json_populate_recordset(
NULL::pg_class
, $1::json -- $1 : '[{"relname":"pg_class","oid":1262},{"relname":"pg_namespace","oid":2615}]'
);json_to_recordset
Π ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΎΡΡΠΎ Β«ΡΠ°Π·Π²ΠΈΠ²Π°Β» ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΈΡ ΠΌΠ°ΡΠΈΠ² ΠΎΡ ΠΎΠ±Π΅ΠΊΡΠΈ Π² ΠΈΠ·Π±ΠΎΡΠ°, Π±Π΅Π· Π΄Π° ΡΠ΅ ΠΎΠΏΠΈΡΠ° Π½Π° ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°:
SELECT
*
FROM
json_to_recordset($1::json) T(k text, v integer);
-- $1 : '[{"k":"a","v":1},{"k":"b","v":2}]'
k | v
-----
a | 1
b | 2ΠΠ ΠΠΠΠΠΠ Π’ΠΠΠΠΠ¦Π
ΠΠΎ Π°ΠΊΠΎ ΠΎΠ±Π΅ΠΌΡΡ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ Π² ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½Π°ΡΠ° ΠΈΠ·Π²Π°Π΄ΠΊΠ° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ»ΡΠΌΠΎ, ΡΠΎ Π΄Π° Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π² Π΅Π΄ΠΈΠ½ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ β Π΅ ΡΡΡΠ΄Π½ΠΎ, Π° ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° ΠΈ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π΅Π΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ Π·Π°Π΄Π΅Π»Π΅Π½ΠΎ Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΠΌΠ΅Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΡΠ»Π³ΠΎ Π΄Π° ΡΡΠ±ΠΈΡΠ°ΡΠ΅ Π³ΠΎΠ»ΡΠΌ ΠΏΠ°ΠΊΠ΅Ρ Π΄Π°Π½Π½ΠΈ ΠΎΡ Π²ΡΠ½ΡΠ½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Π½Π°Π²Π΅Π΄Π½ΡΠΆ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ.
Π ΡΠ°ΠΊΡΠ² ΡΠ»ΡΡΠ°ΠΉ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ :
CREATE TEMPORARY TABLE tbl(k text, v integer);
...
INSERT INTO tbl(k, v) VALUES($1, $2); -- ΠΏΠΎΠ²ΡΠΎΡΠ΅ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΡΠΈ
...
-- ΡΡΠΊ ΠΏΡΠ°Π²ΠΈΠΌ Π½Π΅ΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Ρ ΡΡΠ»Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°
Π’ΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π΅ Π΄ΠΎΠ±ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π° ΡΡΠ΄ΠΊΠΎ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ.
ΠΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠΈ, Π²ΡΠ΅ΠΌΠ΅Π²Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° ΠΎΡ 'ΠΎΠ±ΠΈΡΠ°ΠΉΠ½Π°ΡΠ°' ΡΠ°ΠΌΠΎ ΠΏΠΎ Π΅Π΄ΠΈΠ½ ΠΏΡΠΈΠ·Π½Π°ΠΊ Π² ΡΠΈΡΡΠ΅ΠΌΠ½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° pg_class, Π° Π² pg_type, pg_depend, pg_attribute, pg_attrdef, ... β ΠΏΠΎ ΡΡΡΠ΅ΡΡΠ²ΠΎ Π½Π΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°.
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, Π² ΡΠ΅Π± ΡΠΈΡΡΠ΅ΠΌΠΈ Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΡΠ°ΡΠΊΠΎΡΡΠ°ΠΉΠ½ΠΈ Π²ΡΡΠ·ΠΊΠΈ Π·Π° Π²ΡΡΠΊΠ° ΠΎΡ ΡΡΡ
ΡΠ°ΠΊΠ°Π²Π° ΡΠ°Π±Π»ΠΈΡΠ° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π½ΠΎΠ²ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΡΡΠΈΠ²Π°Ρ ΠΏΡΠΈ Π·Π°ΡΠ²Π°ΡΡΠ½Π΅ΡΠΎ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ° Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π°, Π½Π΅ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΠΌΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° TEMP TABLE Π²ΠΎΠ΄ΠΈ Π΄ΠΎ βΡΠ°Π·ΡΠΈΡΡΠ²Π°Π½Π΅β Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅ Π² pg_catalog ΠΈ Π·Π°Π±Π°Π²ΡΠ½Π΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ.
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Ρ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π±ΠΎΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅Π½ ΠΏΡΠΎΡ
ΠΎΠ΄ VACUUM FULL ΠΏΡΠ΅Π· ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³.
Π‘Π΅ΡΠΈΠΉΠ½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
ΠΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½Π° Π·Π° Π΅Π΄ΠΈΠ½ SQL Π·Π°ΠΏΠΈΡ, Π½ΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° Ρ ΠΏΡΠ°Π²ΠΈΠΌ Π΄ΠΎΡΡΠ° ΡΠ΅ΡΡΠΎ. Π’ΠΎΠ΅ΡΡ, ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π² , Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΏΡΠ΅Π· Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ²ΡΡΠ΄Π΅ ΡΠΊΡΠΏΠΎ.
ΠΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ $n Π·Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π² Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΈΡ Π±Π»ΠΎΠΊ. Π Π΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΠ΅ΡΠΈΠΉΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΡΡΠ° current_setting.
ΠΠΎ Π²Π΅ΡΡΠΈΡ 9.2 Π±Π΅ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ° custom_variable_classes Π·Π° βΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈβ ΡΠ΅ΡΠΈΠΉΠ½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. Π Π°ΠΊΡΡΠ°Π»Π½ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΎΠ±Π°ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π½Π΅ΡΠΎ ΡΠ°ΠΊΠΎΠ²Π°:
SET my.val = '{1,2,3}';
DO $$
DECLARE
id integer;
BEGIN
FOR id IN (SELECT unnest(current_setting('my.val')::integer[])) LOOP
RAISE NOTICE 'id : %', id;
END LOOP;
END;
$$ LANGUAGE plpgsql;
-- NOTICE: id : 1
-- NOTICE: id : 2
-- NOTICE: id : 3Π Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΠΈ Π΅Π·ΠΈΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΈ Π΄ΡΡΠ³ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ.
ΠΠ½Π°Π΅ΡΠ΅ Π»ΠΈ ΠΎΡΠ΅ Π½Π°ΡΠΈΠ½ΠΈ? Π‘ΠΏΠΎΠ΄Π΅Π»Π΅ΡΠ΅ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅!
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
