Python-sivutus Postgres

Johdanto

tämä artikkeli on opetusohjelma Python-sivusta Postgres-aineistosta. Monista syistä, saatat haluta rajoittaa paluuta recordsets pieniä palasia, vastakohtana palauttaa suuria recordsets, joka voi olla kallista sekä kaistanleveys, RAM, ja aika palvelimella, sekä taloudellisuus käyttäjälle. Metodologiamme:

  • mitä ja miksi? Mikä on Python-sivutus PostgreSQL: ssä? Miksi haluamme sivuttaa Postgres-tietomme Pythonilla ja missä olosuhteissa?
  • miten? Miten sivuutamme PostgreSQL-tulokset Pythonilla? Mitkä ovat nopeimpia ja helpoimpia tapoja tehdä tämä pienemmille tietokokonaisuuksille ja mitkä ovat vankempia ja tehokkaampia tapoja suurille tietokannoille ja/tai tilanteissa, joissa palvelimen tai asiakkaan resurssit ovat rajalliset ja tarkkuus on ensiarvoisen tärkeää?

Edeltävät opinnot

  • SQL: SQL: n kirjoittamisen perusteet Postgresille. Käytämme dBeaver koska sen helppous ja useita ominaisuuksia.
  • SELECT: käytämme tässä artikkelissa liberaalia ”SELECT” – komentoa kysyäksemme Postgres-tietokannasta Python-sovelluksella.
  • Nimeämiskäytäntöjen opetusohjelma, josta käy ilmi, miksi haluat käyttää muuttujien, sarakenimien, taulukkonimien jne.etuliitteitä. kuten näette tehty tässä artikkelissa. Esimerkiksi nimeämällä” tvariable ”etuliitteellä” t ”määrittelemään sen” teksti ”(merkkijono) objektiksi ja” tbl_ ” ennen taulukkonimiä, jotta nämä objektit voidaan selvästi erottaa taulukoiksi. Opetusohjelma menee hieman syvemmälle, samoin, puhuu siitä, miten nimetä muuttujia perustuu hierarkia järjestelmä.

luo Postgres-taulukko sivutettavaksi

sanotaan, että luomme Pythonissa ja Postgresissa foorumin tai sisällönhallintajärjestelmän (CMS) ja haluamme taulukon foorumiviestien tallentamiseen.

1
2
3
4
5
6
7
8
9
10
Luo taulukko Julkinen.page_contents (
id_session int4 null DEFAULT 0,
id_author int4 NULL DEFAULT 0,
t_title VARCHAR(256) NULL,
t_contents text NULL,
d_created DATE NULL DEFAULT now (),
rajoite page_contents_pkey PRIMARY KEY (id)
);
luo yksilöllinen Hakemisto page_contents_id_idx on public.page_sisältö käyttäen btreetä (id);

nyt kun meillä on PostgreSQL-taulukko, täytämme sen datalla, joten meillä on jotain testattavaa:

1
2
3
4
5
6
7
8
9
10
11
INSERT INTO
page_ content
(
id_author
, t_title
)
SELECT
RANDOM()*100::INTEGER + 1 AS id_author
, array_to_string(array(SELECT substr (”ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789″, (satunnainen()*(36-1)+1)::kokonaisluku), 1) from generate_series(1,32)),”) AS T_TITLE;
FROM
generate_Series(1,10000);

yleiskatsaus: lisäämme 10000 tietuetta ”page_contents” – taulukkoomme. Jokaista tietuetta varten täytämme ”id_author” – kentän satunnaisluvulla 1: n ja 100: n välillä, mukaan lukien nämä kaksi numeroa. Täytämme myös” t_title ” – kentän 32 merkin satunnaisella merkkijonolla aakkosista.

Huomaa: Jos tarvitset suuremman aineiston, korota yllä oleva ”10000” suuremmaksi.

analyysi

  • lisää: käytti PostgreSQL: n” satunnaisfunktiota”tuottamaan satunnaisluvun välillä 0-99, valoi se kokonaislukuna (”::kokonaisluku”), ja lisätään sitten ”1”, niin että tulos on välillä (inclusive) 1 ja 100 ja on riittävä tietotyyppi sijoittaa sarakkeeseen ”id_author”.
  • array_to_string: valitsemme satunnaisesti kirjaimia 32 kertaa (”generate_series(1,32)”) 36 merkin pituisesta merkkijonosta A: sta Z: ään ja 0: sta 9: ään rakentaaksemme merkkijonon, joka lisätään ”t_title” – kenttään.
  • generate_Series (1,10000): tämä kertoo Postgres SQL-Moottorin tuottavan 10 000 riviä taulukkoon.

nyt kun meillä on suuri aineisto työstettävänämme, tarkastellaan kahta eri tapaa hakea tietoja tästä taulukosta Pythonin avulla.

Python-sivutus Postgres quick and dirty method

vähiten tehokas mutta eniten käytetty on yleensä objekti tai kirjasto, joka – alapuolella – käyttää ”limit-offset” – sivutusta. Tilanteissa, joissa tietokanta on pieni tai keskikokoinen kooltaan, tämän pitäisi toimia hyvin, muutamia haittoja, jos mitään. Myöhemmin, kun käytämme järeämpää menetelmää, puhumme eroista.

ensinnäkin minkä tahansa sivuamismenetelmän edut:

  • ensimmäinen sivu tietosi latautuvat nopeammin. Käyttäjän käsitys siitä, kuinka nopeasti sovellus on, tämä on korvaamaton!
  • suurten aineistojen nopeammat näkymät.
  • bisneslogiikan kapselointipotentiaali (riippuu siitä, miten se tehdään).
  • asiakas saa vähemmän dataa kerrallaan, mikä voi olla superhyötyä, ellei vaatimus tietyissä ympäristöissä.

seuraavaksi käytössä olevia menetelmiä ovat total, limit, offset ja skip.

nyt katsotaan jotain koodia:

1
2
3
4
5
6
7
8
9
10
11
12
13
page_current = 3
records_per_page = 10
offset = (page_current – 1) * records_per_page
s = ””
s += ” SELECT *”
s += ”from page_contents”
s += ”ORDER BY id”
s += ”LIMIT” + records_per_page
s += ”Offset” + Offset
# tuloksena oleva ”raja” osa kyselystä: ”raja 10”
# tuloksena oleva ”offset” osa kyselystä: ”OFFSET 20”

analyysi

  • page_current: testausta varten määritimme nykyisen sivun 3.
  • records_per_page: haluamme palauttaa vain 10 levyä per sivu.
  • offset: tämä on parametri, joka kertoo Postgres kuinka pitkälle ”hypätä” taulukossa. Pohjimmiltaan: ”Ohita näin monta levyä.”
  • s: luo kyselymerkkijonon, joka lähetetään PostgreSQL: ään suoritettavaksi.

suurin ongelma yllä olevassa” limit offset ”- pakinointimenetelmässä on se, että” under the covers ” – Postgres laskee yhteen tietueiden kokonaismäärän, laskee sivuja kyseisen luvun perusteella ja skannaa hakemistoa laskeakseen kuinka monta riviä. Muutamalla ensimmäisellä sivulla tämä hinta ei välttämättä näy. Mutta suuremmilla levysarjoilla ja jopa keskikokoisilla, mitä korkeammalle ”page_current” kasvaa, sitä hitaammat asiat tulevat. Onneksi, on olemassa monia tapoja tehdä sivutus Postgres tiedot.

parempi menetelmä: Etsi ja näppäile sivutus

ratkaisu, joka lievittää joitakin edellä mainitun menetelmän käyttöön liittyviä haittoja, on siirtää edellisen sivun viimeisen tietueen yksilöllinen tunnus.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ID_page_previous = 200
page_current = 3
records_per_page = 10
# limit_optional_offset ei enää tarvita!
limit_optional_offset = (page_current – 1) * records_per_page
s = ””
s += ” SELECT *”
s += ”from page_contents”
s += ”WHERE id >” & id_page_previous
s += ”ORDER BY id”
s += ”limit” + records_per_page
# s += ”Offset” + Offset
# resulting ”limit” part of query: ”limit 10”

huomaa, tällä menetelmällä, emme enää tarvitse OFFSET komento. Lisäämällä” missä ” lausekkeen kertomaan PostgreSQL jättää pois kaikki aiemmat tietueet, jotta se tietää, mistä alkaa näyttää tietueita, pidämme LIMIT komentaa kuinka monta tietuetta palauttaa.

vaikka Postgres-taulukon sivuuttamiseen on varmasti olemassa tehokkaampia menetelmiä, edellä mainittu menetelmä tuo valtavia etuja nopeudessa ja tehokkuudessa. Erittäin tärkeä huomio on: ”id” on indeksoitava.

johtopäätös

tässä opetusohjelmassa opimme kaksi tapaa käyttää Pythonia Postgres-tietojen sivuuttamiseen. Aloitimme luomalla PostgreSQL-taulukon, sitten lisäsimme taulukkoon 10 000 tietuetta, joten meillä oli jotain, mihin perustaa testi, ja sitten vertailimme kahta Pythonin sivutusmenetelmää ja lopuksi analysoimme molempien menetelmien hyvät ja huonot puolet. Tämän prosessin aikana hyödynsimme PostgreSQL: n” random ” – funktiota, Python string concatenaatiota SQL: n rakentamiseen Postgresiin lähetettäväksi ja muuttujan luomista.

Vastaa

Sähköpostiosoitettasi ei julkaista.