ΠΡ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΠΏΠΎΠ΄Π°ΠΉΡΠ΅ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈΠ»ΠΈ Π΄ΠΎΡΠΈ ΡΡΠ»Π° ΡΠ΅Π»Π΅ΠΊΡΠΈΡ ΠΊΡΠΌ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° "Π½Π° Π²Ρ
ΠΎΠ΄Π°". ΠΠΎΠ½ΡΠΊΠΎΠ³Π° ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ°Π½Π½ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
ΠΠ΅ΠΊΠ° Π΄Π° ΠΎΡΠΈΠ΄Π΅ΠΌ "ΠΎΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΡΠΎ" ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° Π½Π΅ Π³ΠΎ ΠΏΡΠ°Π²ΠΈΠΌ, Π·Π°ΡΠΎ ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅.
ΠΠΈΡΠ΅ΠΊΡΠ½ΠΎ "Π²ΠΌΡΠΊΠ²Π°Π½Π΅" Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π² ΡΡΠ»ΠΎΡΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°
ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:
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),...
ΠΡΠ²Π΅Π½ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΏΠΎ-Π³ΠΎΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ "ΠΏΡΠ΅Π·Π°Π»Π΅ΠΏΠ²Π°Π½Π΅ΡΠΎ" Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°, ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π½ΠΈ Π΄ΠΎΠ²Π΅Π΄Π΅ ΠΈ Π΄ΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠ½Π° ΠΏΠ°ΠΌΠ΅Ρ ΠΈ ΡΡΠΈΠ² Π½Π° ΡΡΡΠ²ΡΡΠ°. ΠΡΠΈΡΠΈΠ½Π°ΡΠ° Π΅ ΠΏΡΠΎΡΡΠ° - PG Π·Π°ΠΏΠ°Π·Π²Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΏΠ°ΠΌΠ΅Ρ Π·Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅, Π° Π±ΡΠΎΡΡ Π½Π° Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π² Π½Π°Π±ΠΎΡΠ° Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ ΡΠ°ΠΌΠΎ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Wishlist Π½Π° Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ°. Π ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΊΠ»ΠΈΠ½ΠΈΡΠ½ΠΈ ΡΠ»ΡΡΠ°ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ "Π½ΠΎΠΌΠ΅ΡΠΈΡΠ°Π½ΠΈ" Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ, ΠΏΠΎ-Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΡ $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;
ΠΠ°, Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° "ΡΠ»ΠΎΠΆΠ½ΠΈ" ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π² ΠΌΠ°ΡΠΈΠ², ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ°ΠΌΠΊΠΈΡΠ°Π½ΠΈ Ρ ΠΊΠ°Π²ΠΈΡΠΊΠΈ.
Π―ΡΠ½ΠΎ Π΅, ΡΠ΅ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° "ΡΠ°Π·ΡΠΈΡΠΈΡΠ΅" ΡΠ΅Π»Π΅ΠΊΡΠΈΡΡΠ° Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Π±ΡΠΎΠΉ ΠΏΠΎΠ»Π΅ΡΠ°.
Π³Π½Π΅Π·Π΄ΠΎ, Π³Π½Π΅Π·Π΄ΠΎ,...
ΠΡ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ ΠΈΠΌΠ° ΠΎΠΏΡΠΈΠΈ Π·Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ Π²ΠΌΠ΅ΡΡΠΎ "ΠΌΠ°ΡΠΈΠ² ΠΎΡ ΠΌΠ°ΡΠΈΠ²ΠΈ" Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ "ΠΌΠ°ΡΠΈΠ²Π° ΠΎΡ ΠΊΠΎΠ»ΠΎΠ½ΠΈ", ΠΊΠΎΠΈΡΠΎ ΡΠΏΠΎΠΌΠ΅Π½Π°Ρ
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}'
ΠΠ° ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΡΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ΅ΠΊΠΈ (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-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ ΠΊΡΠΌ Π°Π½ΠΎΠ½ΠΈΠΌΠ΅Π½ Π±Π»ΠΎΠΊ. Π‘Π΅ΡΠΈΠΉΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΡΡΠ° ΡΠ΅ Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ Π΄Π° ΠΈΠ·Π»Π΅Π·Π΅ΠΌ ΠΎΡ ΡΠΈΡΡΠ°ΡΠΈΡΡΠ°. ΡΠ΅ΠΊΡΡΠ°_Π½Π°ΡΡΡΠΎΠΉΠΊΠ°.
ΠΡΠ΅Π΄ΠΈ Π²Π΅ΡΡΠΈΡ 9.2 ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ
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
ΠΠΌΠ° Π΄ΡΡΠ³ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ, Π½Π°Π»ΠΈΡΠ½ΠΈ Π½Π° Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΠΈ Π΅Π·ΠΈΡΠΈ.
ΠΠ½Π°Π΅ΡΠ΅ Π»ΠΈ ΠΎΡΠ΅ Π½Π°ΡΠΈΠ½ΠΈ? Π‘ΠΏΠΎΠ΄Π΅Π»Π΅ΡΠ΅ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅!
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com