ΠΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² Π·Π°ΠΏΡΠΎΡ Π½Π°Π±ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΡΠ΅Π»ΡΡ Π²ΡΠ±ΠΎΡΠΊΡ Β«Π½Π° Π²Ρ
ΠΎΠ΄Β». ΠΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΠΏΠ°Π΄Π°ΡΡΡΡ ΠΎΡΠ΅Π½Ρ ΡΡΡΠ°Π½Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ.
ΠΠΎΠΉΠ΄Π΅ΠΌ Β«ΠΎΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎΒ» ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ Π΄Π΅Π»Π°ΡΡ Π½Π΅ ΡΡΠΎΠΈΡ, ΠΏΠΎΡΠ΅ΠΌΡ, ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π»ΡΡΡΠ΅.
ΠΡΡΠΌΠ°Ρ Β«Π²ΡΠ΅Π·ΠΊΠ°Β» Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ°
ΠΡΠ³Π»ΡΠ΄ΠΈΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ:
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
TEMPORARY TABLE
ΠΠΎ Π΅ΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ Π² ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ Π²ΡΠ±ΠΎΡΠΊΠ΅ ΠΎΡΠ΅Π½Ρ Π²Π΅Π»ΠΈΠΊ, ΡΠΎ Π·Π°ΠΊΠΈΠ½ΡΡΡ Π΅Π³ΠΎ Π² ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ β ΡΡΠΆΠ΅Π»ΠΎ, Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠ°Π·ΠΎΠ²ΠΎΠ³ΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΌΠ° ΠΏΠ°ΠΌΡΡΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ»Π³ΠΎ-Π΄ΠΎΠ»Π³ΠΎ ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π΄Π°Π½Π½ΡΡ ΠΏΠΎ ΡΠΎΠ±ΡΡΠΈΡΠΌ ΠΈΠ· Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, Π° ΠΏΠΎΡΠΎΠΌ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ°Π·ΠΎΠ²ΠΎ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΠ.
Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π»ΡΡΡΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠ°Π½Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
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, … β ΡΠ°ΠΊ ΠΈ Π²ΠΎΠ²ΡΠ΅ Π½ΠΈΡΠ΅ΠΌ.
ΠΠΎΡΡΠΎΠΌΡ Π² web-ΡΠΈΡΡΠ΅ΠΌΠ°Ρ
Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΊΠΎΡΠΎΡΠΊΠΎΠΆΠΈΠ²ΡΡΠΈΡ
ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ
ΡΠ°ΠΊΠ°Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΄Π°Π»ΡΡΡΡΡ Ρ Π·Π°ΠΊΡΡΡΠΈΠ΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Ρ ΠΠ. Π ΠΈΡΠΎΠ³Π΅, Π½Π΅ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΠΌΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ TEMP TABLE ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Β«ΡΠ°ΡΠΏΡΡ
Π°Π½ΠΈΡΒ» ΡΠ°Π±Π»ΠΈΡ Π² pg_catalog ΠΈ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΈΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ
ΠΈΡ
.
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Ρ ΡΡΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΡΠΎΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡ
ΠΎΠ΄Π° VACUUM FULL ΠΏΠΎ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°.
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ
ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠ»ΡΡΠ°Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½Π° Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ SQL-Π·Π°ΠΏΡΠΎΡΠ°, Π½ΠΎ Π΄Π΅Π»Π°ΡΡ Π΅Π΅ Ρ
ΠΎΡΠ΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ°ΡΡΠΎ. Π’ΠΎ Π΅ΡΡΡ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π²
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ $n-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π² Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠΉ Π±Π»ΠΎΠΊ ΠΌΡ ΡΠΎΠΆΠ΅ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΠΌ. ΠΡΠΉΡΠΈ ΠΈΠ· ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ current_setting.
ΠΠΎ Π²Π΅ΡΡΠΈΠΈ 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
ΠΠ° Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΡΡ ΡΠ·ΡΠΊΠ°Ρ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ.
ΠΠ½Π°Π΅ΡΠ΅ Π΅ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ? ΠΠΎΠ΄Π΅Π»ΠΈΡΠ΅ΡΡ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ
!
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com