PostgreSQL Antipatterns: Whakawhitihia nga huinga me te kowhiri ki te SQL

Mai i te wa ki te wa, ka hiahia te kaiwhakawhanake tukuna he huinga tawhā, he kowhiringa katoa ranei ki te tono "i te tomokanga". I etahi wa he tino rerekee nga otinga mo tenei raru.
PostgreSQL Antipatterns: Whakawhitihia nga huinga me te kowhiri ki te SQL
Me haere "mai i te ritenga" ka kite me pehea e kore ai e mahi, he aha, me pehea e pai ake ai.

Tika "whakauru" o nga uara ki te tinana tono

Ko te tikanga he penei te ahua:

query = "SELECT * FROM tbl WHERE id = " + value

... penei ranei:

query = "SELECT * FROM tbl WHERE id = :param".format(param=value)

Mo tenei tikanga e kiia ana, kua tuhia me ara toia nui:

PostgreSQL Antipatterns: Whakawhitihia nga huinga me te kowhiri ki te SQL

Tata ki nga wa katoa ara tika ki te werohanga SQL me tetahi atu kawenga mo te arorau pakihi, ka kaha ki te "whakapiri" i to aho patai.

Ko tenei huarahi ka taea te whakatika i tetahi waahanga mehemea e tika ana. whakamahi wehewehe i roto i nga putanga PostgreSQL 10 me raro mo te mahere pai ake. I enei putanga, ka whakatauhia te rarangi o nga waahanga karapahia me te kore e whai whakaaro ki nga taapiri kua tukuna, i runga noa i te kaupapa o te tinana tono.

$n tohenga

Whakamahia nga kaipupuri waahi he pai nga tawhā, ka taea e koe te whakamahi NGA KORERO KORERO, te whakaiti i te kawenga e rua i runga i te arorau pakihi (ka hangaia te aho uiui ka tukuna kotahi anake) me runga i te tūmau pātengi raraunga (kaore e hiahiatia te whakamaarama me te whakamahere mo ia tauira uiui).

Tau taurangi o nga tohenga

Ka tatari mai nga raru ina hiahia ana tatou ki te tuku i te maha o nga tautohetohenga i mua i te waa:

... id IN ($1, $2, $3, ...) -- $1 : 2, $2 : 3, $3 : 5, ...

Mena ka waiho e koe te tono i roto i tenei puka, na ahakoa tenei ka whakaora i a maatau mai i nga werohanga ka taea, ka mau tonu te hiahia ki te whakapiri / poroporoaki i te tono. mo ia whiringa mai i te maha o nga tohenga. Kua pai ake i te mahi i nga wa katoa, engari ka taea e koe me te kore.

He nui noa te tuku i tetahi tawhā kei roto whakaaturanga raupapa o te huinga:

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

Ko te rereketanga anake ko te hiahia ki te huri i te tohenga ki te momo hurangi e hiahiatia ana. Engari kaore tenei e puta he raruraru, i te mea kua mohio tatou i mua ki te waahi e korero ana tatou.

Tauira whakawhiti (matrix)

I te nuinga o nga wa ko enei momo momo whiringa mo te whakawhiti i nga huinga raraunga hei whakauru ki roto i te papanga raraunga "i roto i te tono kotahi":

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

I tua atu i nga raruraru kua whakahuahia i runga ake nei me te "whakapiri" o te tono, ka taea hoki e tenei te arahi ia tatou kua ngaro te mahara me te tukinga tūmau. He maamaa noa te take - ka rahuitia e PG etahi atu mahara mo nga tautohetohe, a ko te maha o nga rekoata kei roto i te huinga he iti noa ma te tono arorau pakihi Wishlist. I roto i nga keehi haumanu he mea tika kia kite "tau" tohenga nui ake i te $9000 - kaua e pena.

Me tuhi ano te patai, me tono kee "taumata-rua" raupapa:

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;

Ae, mo nga uara "matatini" kei roto i te huinga, me hanga ki nga korukī.
E marama ana ma tenei ka taea e koe te "whakawhanui" te kowhiringa me te maha o nga mara.

koretake, koretake,…

Mai ia wa ki tera wa he whiringa mo te whakawhiti hei utu mo te "ahua o nga rarangi" he maha nga "ahua o nga pou" i whakahuahia e au i roto i te tuhinga whakamutunga:

SELECT
  unnest($1::text[]) k
, unnest($2::integer[]) v;

Ma tenei tikanga, mena ka he koe i te wa e whakaputa ana i nga raarangi uara mo nga pou rereke, he tino ngawari ki te tiki hua ohorere, e whakawhirinaki ana hoki ki te putanga tūmau:

-- $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

Ka timata mai i te putanga 9.3, he tino mahi a PostgreSQL mo te mahi me te momo json. Na reira, ki te tautuhia o tawhā whakauru i roto i te tirotiro, ka taea e koe ki reira ka hanga json ahanoa mo te uiui SQL:

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

Mo nga putanga o mua, ka taea te whakamahi i taua tikanga mo ia(hstore), engari ka tika te "kopi" me te mawhiti i nga mea uaua i te hstore ka raru pea.

json_populate_recordset

Mena ka mohio koe i mua ko nga raraunga mai i te "whakauru" json array ka haere ki te whakaki i etahi ripanga, ka taea e koe te penapena nui i roto i nga mara "whakapae" me te maka ki nga momo e hiahiatia ana ma te whakamahi i te mahi 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

Na tenei mahi ka "whakawhanui" i te huinga o nga mea kua paahitia ki roto i te kowhiringa, me te kore e whakawhirinaki ki te whakatakotoranga ripanga:

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

TEPUTANGA TANGATA

Engari ki te mea he nui rawa te nui o nga raraunga i roto i te tauira kua tukuna, katahi ka uaua te maka ki roto i tetahi tawhā rangatū, i etahi wa kaore e taea, na te mea me kotahi te waa. te tohatoha mahara nui. Hei tauira, me kohikohi koe i te puranga nui o nga raraunga takahanga mai i tetahi punaha o waho mo te wa roa, ka hiahia koe ki te tukatuka i te waa kotahi ki te taha o te paparangi raraunga.

I tenei keehi, ko te otinga pai ko te whakamahi tepu rangitahi:

CREATE TEMPORARY TABLE tbl(k text, v integer);
...
INSERT INTO tbl(k, v) VALUES($1, $2); -- повторить много-много раз
...
-- тут делаем что-то полезное со всей этой таблицей целиком

He pai te tikanga mo te tuku auau o nga pukapuka nui raraunga
Mai i te tirohanga ki te whakaahua i te hanganga o ana raraunga, he rereke te ripanga rangitahi mai i te ripanga "noa" i roto i te waahanga kotahi anake. kei te ripanga punaha pg_class, a roto pg_type, pg_depend, pg_huanga, pg_attrdef, ... — a kahore rawa.

Na reira, i roto i nga punaha tukutuku me te maha o nga hononga poto mo ia o ratou, ka whakaputahia e taua tepu nga rekoata punaha hou i ia wa, ka mukua ina katia te hononga ki te papaarangi. Nāwai rā, Ko te whakamahi koretake o TEMP TABLE ka "pupuhi" o nga ripanga kei pg_catalog me te whakaheke i nga mahi maha e whakamahi ana.
Ko te tikanga, ka taea te whawhai ki tenei te haere i ia wa, KAUPAPA KAUPAPA e ai ki nga ripanga putumōhio pūnaha.

Taurangi Wātū

Mehemea he tino uaua te tukatuka o nga raraunga mai i te keehi o mua mo te patai SQL kotahi, engari me mahi tonu koe. Ko, e hiahia ana matou ki te whakamahi i te tukatuka tikanga i roto i DO poraka, engari ko te whakamahi i te whakawhiti raraunga ma nga ripanga rangitahi ka nui rawa te utu.

Kaore hoki e taea e matou te whakamahi $n-tawhā ki te whakawhiti ki tetahi poraka ingoamuna. Ko nga taurangi huihuinga me te mahi ka awhina i a maatau ki te puta atu i te ahuatanga. tautuhinga_ianei.

I mua i te putanga 9.2, me whirihora i mua mokowā ingoa motuhake ritenga_variable_classes mo "ra" taurangi hui. Mo nga putanga o naianei, ka taea e koe te tuhi penei:

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

He otinga ano kei roto i etahi atu reo whakahaere e tautokohia ana.

E mohio ana etahi atu huarahi? A faaite i roto i nga korero!

Source: will.com

Tāpiri i te kōrero