PostgreSQL Antipatterns: рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рдкрд╛рд╕ рд╕реЗрдЯ рдФрд░ рдЪрдпрди

рд╕рдордп-рд╕рдордп рдкрд░, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрдиреБрд░реЛрдз рдпрд╛ "рдЗрдирдкреБрдЯ" рдХреЗ рдПрдХ рдкреВрд░реЗ рдЪрдпрди рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╣реБрдд рдЕрдЬреАрдм рд╕рдорд╛рдзрд╛рди рдХрднреА-рдХрднреА рд╕рд╛рдордиреЗ рдЖрддреЗ рд╣реИрдВред

"рд╡рд┐рдкрд░реАрдд" рд╕реЗ рдЬрд╛рдиреЗ рджреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдХреНрдпреЛрдВ, рдФрд░ рдЖрдк рдХреИрд╕реЗ рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдореНрдорд┐рд▓рди


рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

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, ... 

рдпрджрд┐ рдЖрдк рдЕрдиреБрд░реЛрдз рдХреЛ рдЗрд╕ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╣рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдЗрдВрдЬреЗрдХреНрд╢рди рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛, рдлрд┐рд░ рднреА рдпрд╣ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХреЛ gluing / рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ред рд╣рд░ рдмрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рд╕рд░рдгреА рдХреЗ рдХреНрд░рдордмрджреНрдз рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╡рд╛рд▓реЗ рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

 ... id = ANY($1::integer[]) -- $1 : '{2,3,5,8,13}' 

рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рддрд░реНрдХ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд╣рд╛рдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдирдореВрдирд╛ рдЕрдВрддрд░рдг (рдореИрдЯреНрд░рд┐рд╕реЗрд╕)


рдЖрдорддреМрд░ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ "рдПрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ" рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

 INSERT INTO tbl(k, v) VALUES($1,$2),($3,$4),... 

рдЕрдиреБрд░реЛрдз рдХреЗ "рд░реА-рд╕реНрдЯрд┐рдХрд┐рдВрдЧ" рдХреЗ рд╕рд╛рде рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдореЗрдореЛрд░реА рдФрд░ рд╕рд░реНрд╡рд░ рдХреНрд░реИрд╢ рд╕реЗ рднреА рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрд╛рд░рдг рд╕рд░рд▓ рд╣реИ - рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреАрдЬреА рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рд╕реЗрдЯ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗрд╡рд▓ рдЖрд╡реЗрджрди рдХрд┐рдП рдЧрдП рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрд┐рд╕реА рдХреЛ $ 9,000 рд╕реЗ рдЕрдзрд┐рдХ "рдЧрд┐рдиреЗ" рддрд░реНрдХреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдерд╛ - рдЬрд┐рд╕рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, "рджреЛ-рд╕реНрддрд░реАрдп" рдХреНрд░рдорд╛рдВрдХрди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП:

 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 рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд┐рдПред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рд╡рд╣реАрдВ SQL рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ json рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 SELECT key k , value v FROM json_each($1::json); -- '{"a":1,"b":2,"c":3,"d":4}' 

рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ (hstore) рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди hstore рдореЗрдВ рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд╕рд╛рде рд╕рд╣реА "рдХрдирд╡рд▓реНрд╢рди" рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

json_populate_recordset


рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ "рдЗрдирдкреБрдЯ" json рд╕рд░рдгреА рд╕реЗ рдбреЗрдЯрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдЧрд╛, рддреЛ рдЖрдк "dereferencing" рдлрд╝реАрд▓реНрдб рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ json_populate_recetet рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 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_dribute, pg_attrdef, ... рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ ... рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдХрдиреЗрдХреНрд╢рди рд╡рд╛рд▓реЗ рд╡реЗрдм-рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ, рдРрд╕реА рддрд╛рд▓рд┐рдХрд╛ рд╣рд░ рдмрд╛рд░ рдирдП рд╕рд┐рд╕реНрдЯрдо рд░рд┐рдХреЙрд░реНрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧреА, рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, TEMP TABLE рдХрд╛ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЙрдкрдпреЛрдЧ pg_catalog рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ "рд╕реВрдЬрди" рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдИ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдмреЗрд╢рдХ, рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдХреИрдЯрд▓реЙрдЧ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ VACUUM рдкреВрд░реНрдг рдЖрд╡рдзрд┐рдХ рдкрд╛рд╕ рдХреА рдорджрдж рд╕реЗ рд▓рдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рддреНрд░ рдЪрд░


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдПрдХрд▓ SQL рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЕрдХреНрд╕рд░ рдкрд░реНрдпрд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рд╣рдо рдбреАрдУ-рдмреНрд▓реЙрдХ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реЛрдЧрд╛ред

рд╣рдо рдЕрдирд╛рдо рдмреНрд▓реЙрдХ рдореЗрдВ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП $ n-рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рд╕рддреНрд░ рдЪрд░ рдФрд░ current_setting рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред

рд╕рдВрд╕реНрдХрд░рдг 9.2 рд╕реЗ рдкрд╣рд▓реЗ, "your" рд╕рддреНрд░ рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ 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 

рдЕрдиреНрдп рд╕рдорд░реНрдерд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдПрдБ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдкрд╛ рд╕рдХрддреА рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдФрд░ рднреА рддрд░реАрдХреЗ рдЬрд╛рдирддреЗ рд╣реИрдВ? рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ!

Source: https://habr.com/ru/post/hi481122/


All Articles