á¡áá«á¡á¬ážáá»á±á¬áºá
áœá¬, developer ááá¯á¡ááºáááºá áá±á¬ááºážááá¯áá»ááºááá¯á· áá±á¬ááºáá
áºáᯠááá¯á·ááá¯áẠááœá±ážáá»ááºááŸá¯áá
áºáá¯áá¯á¶ážááᯠááŒááºáááºážáá«á "áááºáá±á«ááºááŸá¬" áá
áºáá«áá
áºáᶠá€ááŒá¿áá¬á¡ááœáẠá¡ááœááºáá°ážáááºážáá±á¬ ááŒá±ááŸááºážáááºážáá»á¬áž ááŸááááºáá«áááºá
"ááá·áºáá»ááºáááºááá±" ááœá¬ážááŒá
áá¯á·á á¡á²áá«ááᯠáááºááá¯á០ááá¯ááºááá°ážá áá¬ááŒá±á¬áá·áºá áááºááᯠááá¯áá±á¬ááºážá¡á±á¬ááºáá¯ááºááá¯ááºááá²ááá¯áᬠááŒáá·áºáá¡á±á¬ááºá
áá±á¬ááºážááá¯áá»ááºááá¯ááºáááºááœáẠáááºááá¯ážáá»á¬ážááᯠááá¯ááºááá¯áẠ"ááá·áºááœááºážááŒááºáž"
áááºážááẠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº á€áá²á·ááá¯á·áá±á¬áá¯á¶áá±á«áºáááº-
query = "SELECT * FROM tbl WHERE id = " + value
... ááá¯á·ááá¯áẠá€áá²á·ááá¯á·áá±á¬
query = "SELECT * FROM tbl WHERE id = :param".format(param=value)
áá®áááºážáááºážáá²á· áááºáááºááŒá®ážáá±á¬á· áá±ážáá¬ážáá¬ááœá± ááŸááááºá
á¡ááŒá²áááºážááá¯ááᯠááŒá
áºáá±áááºá SQL Injection ááá¯á· ááá¯ááºááá¯ááºáááºážááŒá±á¬ááºáž ááá·áºáá±ážááŒááºážáá»ááºá
á¬ááŒá±á¬ááºážááᯠâáá±á¬áºâ ááá¯ááºážá
á±ááá·áº á
á®ážááœá¬ážáá±ážááá¯ááºáᬠáá¯áá¹áááá±áááá¯ááºáᬠá¡ááá¯áááºáá¯ááºáááºááá¯ážáá
áºáá¯á
á€áá»ááºážáááºááŸá¯ááẠááá¯á¡ááºááŸáᬠáá áºá áááºáá áºááá¯ááºáž ááá¬ážáá»áŸáááá¯ááºáááºá partitioning ááá¯áá¯á¶ážáá«á ááá¯ááá¯áááá±á¬ááºáá±á¬á¡á á®á¡á ááºá¡ááœáẠPostgreSQL áá¬ážááŸááºáž 10 ááŸáá·áºá¡á±á¬ááºááŸáá á€áá¬ážááŸááºážáá»á¬ážááœááºá á áááºááºáááºáá¬ážáá±á¬ ááá¹ááá»á¬ážá á¬áááºážááᯠááá¯á·ááœáŸááºáá±á¬ ááá·áºáááºáá±á¬ááºáá»á¬ážááᯠááá·áºááœááºážá ááºážá á¬ážááŒááºážáááŸááá²á áá±á¬ááºážááá¯áá»ááºááá¯ááºáááºááᯠá¡ááŒá±áá¶ááᬠáá¯á¶ážááŒááºáááºá
$n á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬áž
áá¡áá¯á¶ážááŒá¯ááŸá¯
ááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážá á¡áá±á¡ááœááº
áá»áœááºá¯ááºááá¯á·ááẠá¡áááºáááá¡ááŒááºážá¡áá¯á¶áá»á¬ážá áœá¬ááᯠááŒáá¯áááºáá»á±á¬áºááŒááºááá¯áá±á¬á¡áá«ááœáẠááŒá¿áá¬áá»á¬ážá á á±á¬áá·áºááŒáá¯áá±áááá·áºáááº-
... id IN ($1, $2, $3, ...) -- $1 : 2, $2 : 3, $3 : 5, ...
á¡áááºá áááºááẠá€áá¯á¶á á¶ááŒáá·áº áá±á¬ááºážááá¯áá»ááºááᯠáá¬ážáá²á·áá«áá ááŒá áºááá¯ááºáá»á±ááŸááá±á¬ ááá¯ážáá±ážáá»á¬ážá០áá»áœááºá¯ááºááá¯á·ááᯠáááºáááºááá¯ááºáá±á¬áºáááºáž áááºážááẠáá±á¬ááºážááá¯áá»ááºááᯠáá±á¬áº/ááœá²ááẠááá¯á¡ááºáá±áá²ááŒá áºáááá·áºáááºá á¡ááŒááºážá¡áá¯á¶á¡áá±á¡ááœááºá០ááœá±ážáá»ááºááŸá¯áá áºáá¯á á®á¡ááœááº. á¡ááŒáááºááá¯ááºáž áá¯ááºáá¬ááẠááá¯áá±á¬ááºážáá±ááŒá®á áá«áá±ááá·áº á¡á²áá«ááá«áá² áááºáá¯ááºááá¯ááºáááºá
áá«áá¬áá®áá¬áá áºáá¯áᬠááŒááºáááºážááẠáá¯á¶áá±á¬ááºáá«áááºá array áá áºáá¯á á¡ááŸááºá áẠááá¯ááºá á¬ážááŒá¯ááŸá¯:
... id = ANY($1::integer[]) -- $1 : '{2,3,5,8,13}'
áá áºáá¯áááºážáá±á¬ ááŒá¬ážáá¬ážáá»ááºááŸá¬ argument ááᯠááá¯áá»ááºáá±á¬ array á¡áá»áá¯ážá¡á á¬ážááá¯á· ááŒááºáá¬ážá áœá¬ ááŒá±á¬ááºážááẠááá¯á¡ááºáá«áááºá áá«áá±ááá·áº ááŒá±ááŸááºážáááá·áºáá±áá¬ááᯠááŒáá¯áááá¬ážááŒá®ážááŒá áºááá¯á· áá«á ááŒá¿áá¬áááŒá áºá á±áá«áá°ážá
ááá°áá¬ááœáŸá²ááŒá±á¬ááºážááŸá¯ (áááºááá áº)
á¡áá»á¬ážá¡á¬ážááŒáá·áº áááºážááá¯á·ááẠáá±áá¬áá±á·á áºáá²ááá¯á· ááá·áºááœááºážáááºá¡ááœáẠâáá áºáá¯áááºážáá±á¬ áá±á¬ááºážááá¯ááŸá¯â ááœáẠááá·áºááœááºážáááºá¡ááœáẠáá±áá¬á¡á á¯á¶áá»á¬ážááᯠááœáŸá²ááŒá±á¬ááºážááŒááºážá¡ááœáẠááœá±ážáá»ááºá áá¬á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááŒá áºáááºá
INSERT INTO tbl(k, v) VALUES($1,$2),($3,$4),...
áá±á¬ááºážááá¯áá»ááºá "ááŒááºáááºáá»áááºáááºááŒááºáž" ááŸáá·áº á¡áááºááœááºáá±á¬áºááŒáá¬ážáá±á¬ ááŒá¿áá¬áá»á¬ážá¡ááŒááºá ááŸááºá¥á¬ááºáá²á ááŸáá·áº server áá»ááºáá»ááŒááºážá á¡ááŒá±á¬ááºážááŒáá»ááºááŸá¬ ááá¯ážááŸááºážááẠ- PG ááẠá¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážá¡ááœáẠá¡ááá¯ááŸááºáá¬ááºááᯠááááºážáááºážáá¬ážááŒá®ážá áá¯ááºáááºážááá¯ááºáᬠáá¯áá¹áááá±áá¡ááá®áá±ážááŸááºáž Wishlist ááŸáá¬áá»áŸáẠá¡á á¯á¡áá±ážá¡ááœááºáž ááŸááºáááºážá¡áá±á¡ááœááºááᯠááá·áºáááºáá¬ážáááºá á¡áá°ážáááŒáá·áº áá±ážáááºážáá»á¬ážááœáẠááŒáá·áºááŸá¯ááẠááá¯á¡ááºáá«áááºá $9000 áááºááŒá®ážáá±á¬ "áá¶áá«ááº" á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬áž - áá®áááºážáá²á· ááá¯ááºáá«áá²á·á
áá»áŸá±á¬ááºáá¬ážááŒá®ážáá¬áž áá±ážááœááºážááᯠááŒááºáá±ážááŒáá·áºáá¡á±á¬áẠ" two-level" á¡ááŸááºá ááº:
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;
ááŸááºáá«áááºá áááºážáá»ááºážááŸá¯áá
áºáá¯á¡ááœááºážááŸá "ááŸá¯ááºááœá±ážáá±á¬" áááºááá¯ážáá»á¬ážááᯠááá¯ážáá¬ážáá»ááºáá»á¬ážááŒáá·áº áá±á¬ááºáááºáá¬ážááẠááá¯á¡ááºáá«áááºá
á€áááºážááŒáá·áº áááºááẠááœá±ážáá»ááºááŸá¯ááᯠá¡ááœááºáá»á¬áž á¡áá»á¬ážá¡ááŒá¬ážááŒáá·áº "áá»á²á·ááœááºááá¯ááºáááº" áá°áááºááŸá¬ ááŸááºážáá«áááºá
áááŒáááºááááºá áááŒáááºááááº...
á¡áá«á¡á¬ážáá»á±á¬áºá
áœá¬ áá»áœááºá¯ááºáá±á¬áºááŒáá²á·áá±á¬ "array of array" á¡á
á¬áž ááŒááºáááºážááẠááœá±ážáá»ááºá
áá¬áá»á¬áž ááŸááááºá
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 á¡áá»áá¯ážá¡á á¬ážááŸáá·áºá¡áá¯ááºáá¯ááºáááºá¡ááœáẠááŒáá·áºá á¯á¶áá±á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááŸááááºá ááá¯á·ááŒá±á¬áá·áºá áááºáááá·áºááœááºážááŸá¯áá±á¬ááºáá»á¬ážááᯠbrowser ááœááºáááºááŸááºáá¬ážáá«áá áááºáááºááá¯áá±áá¬ááœááºáá¯á¶á á¶ááœááºážááá¯ááºáááºá SQL query á¡ááœáẠjson object:
SELECT
key k
, value v
FROM
json_each($1::json); -- '{"a":1,"b":2,"c":3,"d":4}'
ááááºáá¬ážááŸááºážáá»á¬ážá¡ááœáẠáá°áá®áá±á¬áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá (hstore) áá áºáá¯á á®áááá¯á·áá±á¬áº hstore ááŸá ááŸá¯ááºááœá±ážáá±á¬ á¡áá¬áá»á¬ážááᯠááœááºááŒá±ážááŒááºážááŒáá·áº ááŸááºáááºáá±á¬ "áá±á«ááºááŒááºáž" ááẠááŒá¿áá¬áá»á¬ážááᯠááŒá áºá á±ááá¯ááºáááºá
json_populate_recordset
âinputâ json array á០áá±áá¬ááẠá¡áá»áá¯á·ááá¬ážááœáẠááŒáá·áºá áœááºááẠáá±á¬ááºááœá¬ážáááºááᯠáááºááŒáá¯áááºáááá«áá áááºááẠâdeferencingâ á¡ááœááºáá»á¬ážááœáẠá¡áá»á¬ážááŒá®áž ááááºážáááºážááá¯ááºááŒá®áž 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
áá¬áá®á á¬ážááœá²
ááá¯á·áá±á¬áº ááá¯á·ááœáŸááºáá±á¬ááá°áá¬ááŸá áá±áá¬ááá¬áááẠá¡ááœááºááŒá®ážáá¬ážáá«áá áááºážááᯠáá¶áá«ááºá ááºáááºááŸááºáá¬ážáá±á¬ ááá·áºáááºáá±á¬ááºáá áºáá¯áá²ááá¯á· áá áºáá»ááŒááºážááẠáá áºááŒáááºáá áºáá«ááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº áá áºáá«áá áºáá¶ááœáẠáááŒá áºááá¯ááºáá±á ááŒá®ážáá¬ážáá±á¬ memory ááœá²áá±ááŸá¯. á¥ááá¬á¡á¬ážááŒáá·áºá áááºááẠááŒááºáá áá áºáá áºáá¯á០ááŒá áºáááºáá±áᬠá¡á á¯á¡áá±ážááŒá®ážááᯠá¡áá»áááºá¡ááŒá¬ááŒá®áž á á¯áá±á¬ááºážáá¬ážááẠááá¯á¡ááºááŒá®áž áááºážááᯠáá±áá¬áá±á·á áºáááºááœáẠáá áºááŒáááºáááºáž áá¯ááºáá±á¬ááºááá¯áá«áááºá
á€ááá
á¹á
ááœááºá á¡áá±á¬ááºážáá¯á¶ážááŒá±ááŸááºážáá»ááºáááºá¡áá¯á¶ážááŒá¯áááºááŒá
áºáááá·áºáááºá
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 ááŸá ááá¬ážáá»á¬áž "áá±á¬ááºáááºážááŒááºáž" ááᯠááŒá
áºá
á±ááẠááŸáá·áº áááºážááá¯á·ááᯠá¡áá¯á¶ážááŒá¯ááá·áº áá¯ááºáááºážáá»á¬ážá
áœá¬ááᯠááŸá±ážááœá±ážá
á±áááºá
áá¯ááºáá«áááºá Periodic pass VACUUM FULL á
áá
áºáááºááá±á¬ááºááá¬ážáá»á¬ážá¡ááá¯ááºážá
Session Variables áá»á¬áž
SQL query áá
áºáá¯áááºážá¡ááœáẠááááºááá
á¹á
á០áá±áá¬ááᯠáá¯ááºáá±á¬ááºááŒááºážááẠááŸá¯ááºááœá±ážáááºááá¯áá«á
áá¯á·á ááá¯á·áá±á¬áº áááºáááŒá¬ááááŒá¯áá¯ááºááá¯áá«áááºá ááá¯ááá¯áááºááŸá¬ áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáá¯á¶ážáá¯ááºáááºáž áá¯ááºáááºážá
ááºáá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯ááá¯áá«áááºá
á¡áááºáááááá±á¬ááºáá áºáá¯ááá¯á· áá±ážááá¯á·ááẠ$n-áá«áá¬áá®áá¬áá»á¬ážááᯠáá»áœááºá¯ááºááá¯á·áááºáž á¡áá¯á¶ážáááŒá¯ááá¯ááºáá«á session variable áá»á¬ážááŸáá·áº function áá»á¬ážááẠá¡ááŒá±á¡áá±á០áá¯ááºážááœááºááẠáá°áá®áá±ážáá«áááºá áááºááŸá_áááºáááº.
áá¬ážááŸááºáž 9.2 áááá¯ááºáá®á áááºááẠááŒáá¯ááẠconfigure áá¯ááºááẠááá¯á¡ááºáááºá
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
á¡ááŒá¬ážáá±á¬ áá¶á·ááá¯ážáá±ážáá¬ážáá±á¬ áá¯ááºáá¯á¶ážáá¯ááºáááºážáá¬áá¬á áá¬ážáá»á¬ážááŒáá·áº áááŸáááá¯ááºáá±á¬ á¡ááŒá¬ážáá±á¬ ááŒá±ááŸááºážáááºážáá»á¬áž ááŸááá«áááºá
áá±á¬ááºáááºáááºážáááºážáá»á¬áž áááá«ááá¬ážá ááŸááºáá»ááºáá»á¬ážááœááºáá»áŸáá±áá«á
source: www.habr.com