"Database as Code" Phihlelo

"Database as Code" Phihlelo

SQL, ke eng e ka bang bonolo? E mong le e mong oa rona a ka ngola kopo e bonolo - rea thaepa khetha, thathamisa likholomo tse hlokahalang, ebe ho tloha, lebitso la tafole, maemo a seng makae ho moo mme ke phetho - data e sebetsang ka pokothong ea rona, le (hoo e batlang e le) ho sa tsotelehe hore na DBMS e tlas'a hood ka nako eo (kapa mohlomong ha se DBMS ho hang). Ka lebaka leo, ho sebetsa le hoo e batlang e le mohloli ofe kapa ofe oa data (kamano le ha ho joalo) ho ka nkoa ho tloha ponong ea khoutu e tloaelehileng (ka liphello tsohle - taolo ea phetolelo, tlhahlobo ea khoutu, tlhahlobo ea static, autotests, 'me ke tsohle). 'Me sena ha se sebetse feela ho data ka boeona, merero le ho falla, empa ka kakaretso ho bophelo bohle ba polokelo. Sehloohong sena, re tla bua ka mesebetsi ea letsatsi le letsatsi le mathata a ho sebetsa le li-database tse fapaneng tlas'a "database as code".

Mme ha re qaleng hantle feela ORM. Lintoa tsa pele tse kang "SQL vs ORM" li ile tsa bonoa morao Pele ho Petrine Rus.

'Mapa oa kamano ea ntho

Batšehetsi ba ORM ka tloaelo ba ananela lebelo le boiketlo ba tsoelo-pele, boipuso ho DBMS le bohloeki ba khoutu. Bakeng sa ba bangata ba rona, khoutu ea ho sebetsa le database (mme hangata database ka boeona)

hangata e shebahala tjena ...

@Entity
@Table(name = "stock", catalog = "maindb", uniqueConstraints = {
        @UniqueConstraint(columnNames = "STOCK_NAME"),
        @UniqueConstraint(columnNames = "STOCK_CODE") })
public class Stock implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "STOCK_ID", unique = true, nullable = false)
    public Integer getStockId() {
        return this.stockId;
    }
  ...

Mohlala o phuthetsoe ka litlhaloso tse bohlale, 'me kae-kae ka morao ho liketsahalo, ORM e sebete e hlahisa le ho phethahatsa lithane tsa khoutu e itseng ea SQL. Ka tsela, bahlahisi ba leka ka matla ohle a bona ho itšehla thajana ho tsoa ho database ea bona ka lik'hilomithara tse ling, tse bonts'ang tse ling. "SQL ea lehloeo".

Ka lehlakoreng le leng la lithibelo, batšehetsi ba "tse entsoeng ka matsoho" -SQL ba hlokomela bokhoni ba ho pepeta lero lohle ho tsoa ho DBMS ea bona ntle le likarolo tse ling le likheo. Ka lebaka leo, merero ea "data-centric" e hlaha, moo ho nang le batho ba koetlisitsoeng ka ho khetheha ba kentsoeng polokelong ea litaba (e boetse e le "basicist", hape ke "basicist", hape ke "bazdenshchiks", joalo-joalo), le bahlahisi feela. ba tlameha ho "hula" maikutlo a lokiselitsoeng le mekhoa e bolokiloeng, ntle le ho kena ka lintlha.

Mme ho thoe'ng haeba u nka tse ntle ka ho fetisisa tsa lefatše ka bobeli? E etsoa joang ka sesebelisoa se setle se nang le lebitso le tiisang bophelo Eeql. Ke tla fana ka mela e 'maloa ho tsoa mohopolong o akaretsang phetolelong ea ka ea mahala,' me u ka tloaelana le eona ka botlalo. mona.

Clojure ke puo e monate ea ho aha li-DSL, empa SQL ka boeona ke DSL e ntle 'me ha re hloke e' ngoe. Litlhaloso tsa S li ntle, empa ha li kenye letho le lecha mona. Ka lebaka leo, re fumana li-brackets molemong oa li-brackets. Ha u lumellane? Ebe u emela nako eo ka eona ho tlosoa ha database ho tla lutla, 'me u tla qala ho loana le ts'ebetso (e tala-sql)

Le ho etsa eng? Ha re tloheleng SQL e le SQL e tloaelehileng - faele e le 'ngoe ka kopo:

-- name: users-by-country
select *
  from users
 where country_code = :country_code

... ebe o bala faele eo, o e fetola mosebetsi o tloaelehileng oa Clojure:

(defqueries "some/where/users_by_country.sql"
   {:connection db-spec})

;;; A function with the name `users-by-country` has been created.
;;; Let's use it:
(users-by-country {:country_code "GB"})
;=> ({:name "Kris" :country_code "GB" ...} ...)

Ka ho latela molao-motheo oa "SQL e arohaneng, Clojure arohaneng", o fumana:

  • Ha ho na lintho tse makatsang tse makatsang. Sebaka sa hau sa polokelo ea boitsebiso (joaloka tse ling) ha se lumellane le 100% SQL - empa Yesql ha e tsotelle. Ha ho mohla u tla senya nako ho tsoma mesebetsi ka syntax e lekanang le SQL. Ha ho mohla u tla tlameha ho khutlela tšebetsong (raw-sql "tse ling('funky'::SYNTAX)")).
  • Ts'ehetso e ntle ea mohlophisi. Mohlophisi oa hau o se a ntse a e-na le tšehetso e ntle haholo ea SQL. Ka ho boloka SQL joalo ka SQL u ka e sebelisa feela.
  • Tšebelisano ea Sehlopha. Li-DBA tsa hau li ka bala le ho ngola SQL eo u e sebelisang morerong oa hau oa Clojure.
  • Tokiso ea tšebetso e bonolo. U hloka ho etsa moralo bakeng sa potso e nang le bothata? Sena ha se bothata ha potso ea hau e le SQL e tloaelehileng.
  • Ho sebelisa lipotso hape. Hula lifaele tse tšoanang tsa SQL mererong e meng hobane ke SQL ea khale e ntle - e arolelane feela.

Ka maikutlo a ka, khopolo ena e pholile haholo 'me ka nako e ts'oanang e bonolo haholo, ka lebaka leo morero o fumaneng chelete e ngata. balateli ka dipuo tse fapaneng. 'Me joale re tla leka ho sebelisa filosofi e ts'oanang ea ho arola khoutu ea SQL ho tsohle tse ling tse fetang ORM.

Batsamaisi ba IDE & DB

Ha re qaleng ka mosebetsi o bonolo oa letsatsi le letsatsi. Hangata re tlameha ho batla lintho tse ling polokelong ea polokelo, mohlala, ho fumana tafole ho schema le ho ithuta sebopeho sa eona (e leng litšiea, linotlolo, li-index, lithibelo, joalo-joalo). 'Me ho tsoa ho IDE efe kapa efe ea graphical kapa DB-manager, pele ho tsohle, re emetse bokhoni bona. E le hore e potlake 'me ha ho hlokahale hore e eme halofo ea hora ho fihlela fensetere e nang le boitsebiso bo hlokahalang e huloa (haholo-holo ka khokahanyo e liehang ho database e hole),' me ka nako e ts'oanang tlhahisoleseling e fumanoeng e ncha ebile e bohlokoa, e seng cached junk. Ho feta moo, ha database e ntse e rarahane le ho feta, 'me palo ea bona e le kholoanyane, ho thata le ho feta ho e etsa.

Empa hangata ke lahlela toeba hole ebe ke ngola khoutu feela. Ha re re u batla ho tseba hore na ke litafole life (le hore na ke thepa efe) tse fumanehang ho "HR" schema. Ho DBMS e ngata, sephetho se lakatsehang se ka finyelloa ka potso e bonolo joalo ho tsoa ho information_schema:

select table_name
     , ...
  from information_schema.tables
 where schema = 'HR'

Ho tloha ho database ho ea ho database, litaba tsa litafole tse joalo li fapana ho latela bokhoni ba DBMS ka 'ngoe. Mme, mohlala, bakeng sa MySQL, ho tsoa bukeng e le 'ngoe, o ka fumana liparamente tsa tafole tse ikhethileng ho DBMS ena:

select table_name
     , storage_engine -- Используемый "движок" ("MyISAM", "InnoDB" etc)
     , row_format     -- Формат строки ("Fixed", "Dynamic" etc)
     , ...
  from information_schema.tables
 where schema = 'HR'

Oracle ha e tsebe information_schema, empa ea tseba Metadata ea Oracle, 'me ha ho na mathata a maholo:

select table_name
     , pct_free       -- Минимум свободного места в блоке данных (%)
     , pct_used       -- Минимум используемого места в блоке данных (%)
     , last_analyzed  -- Дата последнего сбора статистики
     , ...
  from all_tables
 where owner = 'HR'

ClickHouse le eona e joalo:

select name
     , engine -- Используемый "движок" ("MergeTree", "Dictionary" etc)
     , ...
  from system.tables
 where database = 'HR'

Ho ka etsoa ntho e tšoanang ho Cassandra (e nang le malapa a likholomo sebakeng sa litafole le likheo tsa linotlolo sebakeng sa meralo):

select columnfamily_name
     , compaction_strategy_class  -- Стратегия сборки мусора
     , gc_grace_seconds           -- Время жизни мусора
     , ...
  from system.schema_columnfamilies
 where keyspace_name = 'HR'

Bakeng sa li-database tse ling tse ngata, u ka boela ua tla le lipotso tse tšoanang (esita le Mongo o na le pokello e khethehileng ea tsamaiso, e nang le boitsebiso bo mabapi le likoleke tsohle tsamaisong).

Ha e le hantle, ka tsela ena u ka fumana tlhahisoleseding eseng feela ka litafole, empa ka kakaretso ka ntho leha e le efe. Nako le nako, batho ba mosa ba arolelana khoutu e joalo bakeng sa li-database tse fapaneng, joalo ka mohlala, letotong la lihlooho tsa habra "Mesebetsi ea ho ngola li-database tsa PostgreSQL" (ayb, Ben, Boikoitliso). Ehlile, ho boloka lipotso tsena kaofela ka hloohong ea ka le ho li ngola khafetsa ke "monate", kahoo ho IDE / mohlophisi oa ka ke o ratileng, ke na le sete e lokiselitsoeng esale pele ea lipotso tse sebelisoang khafetsa, 'me se setseng ke ho tlanya mabitso a ntho ka har'a thempleite.

Ka lebaka leo, mokhoa ona oa ho tsamaea le ho batla lintho o bonolo haholoanyane, o boloka nako e ngata, o u lumella ho fumana boitsebiso bo nepahetseng le ka mokhoa oo u o hlokang ka oona hona joale (joalo ka mohlala, o hlalositsoeng posong). "Reka data ho tsoa ho database ka sebopeho sefe kapa sefe: seo li-IDE tse sethaleng sa IntelliJ li ka se etsang").

Ts'ebetso ka lintho

Ka mor'a hore re fumane le ho ithuta lintho tse hlokahalang, ke nako ea ho etsa ho hong ho molemo ka tsona. Ka tlhaho, hape ntle le ho tlosa menoana ea hau ho keyboard.

Ha se lekunutu la hore ho hlakola tafole feela ho tla shebahala ka mokhoa o ts'oanang hoo e batlang e le lits'ebetsong tsohle:

drop table hr.persons

Empa ka pōpo ea tafole e se e ntse e thahasellisa haholoanyane. Hoo e batlang e le DBMS efe kapa efe (ho kenyeletsoa ba bangata ba NoSQL) e ka "etsa tafole" ka mokhoa o mong kapa o mong, mme karolo ea eona e kholo e tla fapana hanyane (lebitso, lethathamo la litšiea, mefuta ea data), empa lintlha tse ling li ka fapana haholo mme li itšetlehile ka sesebelisoa sa kahare. le bokhoni ba DBMS e itseng. Mohlala oo ke o ratang ka ho fetisisa ke oa hore litokomaneng tsa Oracle ho na le BNF e le 'ngoe feela e "se nang letho" bakeng sa syntax ea "bopa tafole". nka maqephe a 31. DBMS tse ling li na le bokhoni bo itekanetseng, empa e 'ngoe le e' ngoe ea tsona e na le likarolo tse ngata tse thahasellisang le tse ikhethang bakeng sa ho theha litafole (lipapatso, MySQL, lephele, Cassandra). Ha ho na monyetla oa hore "wizard" e 'ngoe le e' ngoe e tsoang ho IDE e latelang (haholo-holo bokahohleng) e tla khona ho koahela bokhoni bona bohle, 'me haeba e khona, e ke ke ea e-ba pono bakeng sa batho ba fokolang ba pelo. Ka nako e ts'oanang, polelo e ngotsoeng e nepahetseng le e nakong theha tafole e tla u lumella ho li sebelisa kaofela ha tsona, ho etsa hore polokelo le phihlello ea data ea hau e tšepahale, e be e nepahetseng ebile e phutholohile kamoo ho ka khonehang.

Hape, li-DBMS tse ngata li na le mefuta ea tsona e khethehileng ea lintho tse sa fumaneheng ho tse ling tsa DBMS. Ho feta moo, re ka etsa ts'ebetso eseng feela ka lintho tsa database, empa hape le ho DBMS ka boeona, mohlala, "bolaea" ts'ebetso, ho lokolla sebaka se itseng sa mohopolo, ho nolofalletsa ho latela, ho fetola mokhoa oa "bala feela", le tse ling tse ngata.

Mme jwale ha re takang hanyenyane

E 'ngoe ea mesebetsi e tloaelehileng ke ho aha setšoantšo se nang le lintho tsa database, ho bona lintho le likamano pakeng tsa tsona ka setšoantšo se setle. Hoo e ka bang IDE efe kapa efe e hlakileng, lisebelisoa tse arohaneng tsa "command line", lisebelisoa tse ikhethang tsa litšoantšo le li-model li ka etsa sena. E tla u hulela ho hong "ka moo ba ka khonang", 'me u ka susumetsa ts'ebetso ena hanyane ka thuso ea li-parameter tse' maloa faeleng ea tlhophiso kapa li-checkbox tsa sebopeho.

Empa bothata bona bo ka rarolloa ka mokhoa o bonolo haholoanyane, o feto-fetohang le o boreleli, 'me ho hlakile ka thuso ea khoutu. Ho theha litšoantšo tse rarahaneng, re na le lipuo tse 'maloa tse ikhethileng ka nako e le ngoe (DOT, GraphML, joalo-joalo),' me bakeng sa tsona - likopo tse ngata (GraphViz, PlantUML, Mermaid) tse ka balang litaelo tse joalo le ho li bona ka mahlo a kelello. mefuta e fapaneng ya dibopeho. Joale, re se re ntse re tseba ho fumana leseli mabapi le lintho le likamano lipakeng tsa tsona.

Ha re fane ka mohlala o monyane oa hore na e ka shebahala joang ha u sebelisa PlantUML le database ea demo bakeng sa PostgreSQL (ka ho le letšehali ke potso ea SQL e tla hlahisa taelo e hlokahalang bakeng sa PlantUML, 'me ka ho le letona ke sephetho):

"Database as Code" Phihlelo

select '@startuml'||chr(10)||'hide methods'||chr(10)||'hide stereotypes' union all
select distinct ccu.table_name || ' --|> ' ||
       tc.table_name as val
  from table_constraints as tc
  join key_column_usage as kcu
    on tc.constraint_name = kcu.constraint_name
  join constraint_column_usage as ccu
    on ccu.constraint_name = tc.constraint_name
 where tc.constraint_type = 'FOREIGN KEY'
   and tc.table_name ~ '.*' union all
select '@enduml'

'Me haeba u leka hanyenyane, joale motheong oa ER template bakeng sa PlantUML o ka fumana ntho e ts'oanang haholo le setšoantšo sa 'nete sa ER:

Potso ea SQL e thata haholoanyane

-- Шапка
select '@startuml
        !define Table(name,desc) class name as "desc" << (T,#FFAAAA) >>
        !define primary_key(x) <b>x</b>
        !define unique(x) <color:green>x</color>
        !define not_null(x) <u>x</u>
        hide methods
        hide stereotypes'
 union all
-- Таблицы
select format('Table(%s, "%s n information about %s") {'||chr(10), table_name, table_name, table_name) ||
       (select string_agg(column_name || ' ' || upper(udt_name), chr(10))
          from information_schema.columns
         where table_schema = 'public'
           and table_name = t.table_name) || chr(10) || '}'
  from information_schema.tables t
 where table_schema = 'public'
 union all
-- Связи между таблицами
select distinct ccu.table_name || ' "1" --> "0..N" ' || tc.table_name || format(' : "A %s may haven many %s"', ccu.table_name, tc.table_name)
  from information_schema.table_constraints as tc
  join information_schema.key_column_usage as kcu on tc.constraint_name = kcu.constraint_name
  join information_schema.constraint_column_usage as ccu on ccu.constraint_name = tc.constraint_name
 where tc.constraint_type = 'FOREIGN KEY'
   and ccu.constraint_schema = 'public'
   and tc.table_name ~ '.*'
 union all
-- Подвал
select '@enduml'

"Database as Code" Phihlelo

Haeba u sheba ka hloko, tlas'a hood, lisebelisoa tse ngata tsa pono li boetse li sebelisa lipotso tse tšoanang. Ke 'nete hore hangata likōpo tsena li tebile "hardwired" ho khoutu ea ts'ebeliso ka boeona mme ho thata ho e utloisisare sa bue ka phetoho leha e le efe ea tsona.

Metrics le monitoring

Ha re feteleng sehloohong se neng se le thata - ho lekola ts'ebetso ea database. Ke hopola pale e nyane ea 'nete eo ke e boleletsoeng ke "e mong oa metsoalle ea ka". Mosebetsing o latelang, ho ne ho lula DBA e itseng e matla, 'me ba seng bakae ba bahlahisi ba ne ba mo tseba ka boeena,' me ka sebele ba ne ba kile ba mo bona mahlong (ho sa tsotellehe hore o ne a sebetsa, ho ea ka menyenyetsi, kae-kae mohahong o haufi) . Ka hora "X", ha tsamaiso ea poduction ea morekisi e moholo e qala ho "ikutloa hampe" hape, o ile a romela li-screenshots tsa li-graph ho tsoa ho Oracle Enterprise Manager, moo a ileng a totobatsa ka hloko libaka tse mahlonoko tse nang le letšoao le khubelu bakeng sa "ho hlaka" (sena, ho se beha ka bonolo, se thusitse hanyane). 'Me "photocard" ena e ne e lokela ho phekoloa. Ka nako e ts'oanang, ha ho motho ea neng a e-na le phihlelo ea bohlokoa (ka maikutlo a mabeli a lentsoe) Enterprise Manager, hobane tsamaiso ena e rarahane ebile e theko e boima, ka tšohanyetso "bahlahisi ba tla khoptjoa ho hong 'me ba robe ntho e' ngoe le e 'ngoe." Ka hona, baetsi ba "empirically" ba fumane sebaka le sesosa sa mariki mme ba lokolla patch. Haeba lengolo le tšabehang le tsoang ho DBA le sa ka la tla hape nakong e tlang e haufi, joale bohle ba phefumoloha 'me ba khutlela mesebetsing ea bona ea morao-rao (ho fihlela Lengolo le lecha).

Empa ts'ebetso ea ho beha leihlo e ka shebahala e le monate ebile e le botsoalle, 'me ea bohlokoa ka ho fetisisa, e fumaneha habonolo ebile e hlakile ho bohle. Bonyane karolo ea eona ea mantlha, e le tlatsetso ho lits'ebetso tsa mantlha tsa ho beha leihlo (tseo ka sebele li leng molemo ebile li ke ke tsa nkeloa sebaka hangata). DBMS efe kapa efe e lokolohile ebile e lokolohile ka botlalo, e ikemiselitse ho arolelana tlhahisoleseling mabapi le boemo ba eona ba hajoale le ts'ebetso ea eona. Ho "bloody" e tšoanang ea Oracle DB, hoo e ka bang tlhahisoleseling efe kapa efe ea ts'ebetso e ka fumanoa ho tsoa liponong tsa sistimi, ho tloha lits'ebetsong le mananeong ho isa boemong ba cache ea buffer (mohlala, Mengolo ea DBA, karolo ea "Boitlhokomelo"). Postgresql e boetse e na le maikutlo a mangata a tsamaiso bakeng sa tlhokomelo ea ts'ebetso ea database, haholo-holo, tse joalo tsa bohlokoa bophelong ba letsatsi le letsatsi ba DBA efe kapa efe joalo ka pg_stat_activity, pg_stat_database, pg_stat_bgwriter. Ho MySQL, esita le schema e arohaneng e etselitsoe sena. performance_schema. A B Mongo e hahiloeng profaele e kopanya lintlha tsa ts'ebetso hore e be pokello ea sistimi tsamaiso.profaele.

Kahoo, o hlometse ka mofuta o mong oa pokello ea metrics (Telegraf, Metricbeat, Collectd), e ka khonang ho etsa lipotso tse tloaelehileng tsa sql, polokelo ea metrics ena (InfluxDB, Elasticsearch, Timescaledb) le sebui (Grafana, Kibana), o ka fumana ka nepo. mokhoa o bonolo le o bonolo oa ho shebella o tla kopanngoa ka thata le metrics e meng ea tsamaiso (e fumanoang, ka mohlala, ho tswa ho seva sa kopo, ho tloha ho OS, joalo-joalo). Joalo ka mohlala, e etsoa ho pgwatch2, e sebelisang sephutheloana sa InfluxDB + Grafana le sehlopha sa lipotso ho lipono tsa sistimi, tseo le tsona li ka bang teng. eketsa likopo tse tloaelehileng.

Kakaretso

Mme lena ke lethathamo le lekantsoeng la se ka etsoang ka database ea rona ho sebelisoa khoutu e tloaelehileng ea SQL. Ke na le bonnete ba hore o ka fumana lits'ebetso tse ling tse ngata, ngola litlhalosong. 'Me re tla bua ka hore na ('me habohlokoa ka ho fetisisa ke hobane'ng) ho iketsetsa tsena tsohle le ho li kenyelletsa pompong ea hau ea CI / CD nakong e tlang.

Source: www.habr.com

Eketsa ka tlhaloso