{"id":4362,"date":"2026-06-28T15:07:09","date_gmt":"2026-06-28T12:07:09","guid":{"rendered":"https:\/\/webanalyst.ro\/?p=4362"},"modified":"2026-06-28T15:30:36","modified_gmt":"2026-06-28T12:30:36","slug":"dbplyr-2-6-0","status":"publish","type":"post","link":"https:\/\/webanalyst.ro\/blog\/2026\/dbplyr-2-6-0\/","title":{"rendered":"Interog\u0103ri \u00een SQL \u0219i R cu dbplyr 2.6.0"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>dbplyr<\/strong> este un pachet extrem de puternic din ecosistemul <code>tidyverse<\/code> al limbajului <strong>R<\/strong>. Acesta permite folosirea sintaxei <code>dplyr<\/code> direct pe baze de date. Utilizatorul poate s\u0103 scrie codul \u00een limbajul R (<code>filter<\/code>, <code>select<\/code>, <code>mutate<\/code>, <code>group_by<\/code>, <code>summarise<\/code> etc.), iar <code>dbplyr<\/code> \u00eel traduce automat \u00een SQL \u0219i \u00eel ruleaz\u0103 \u00een baza de date, f\u0103r\u0103 s\u0103 \u00eencarci datele \u00een memorie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ini\u021bial, <code>tidyverse<\/code> a avut un singur pachet pentru manipularea \u0219i cur\u0103\u021barea datelor, numir <code>dplyr<\/code>, dar \u00een iunie 2017 s-a lansat <code>dbplyr<\/code> pentru cei care utilizeaz\u0103 baze de date SQL. Anul acesta am scris un alt <a href=\"https:\/\/webanalyst.ro\/blog\/2026\/dplyr-1-2-0\/\" target=\"_blank\" rel=\"noreferrer noopener\">articol despre istoria \u0219i nout\u0103\u021bile din <code>dplyr<\/code><\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00cenapoi la pachetul folosit pentru SQL, acesta \u0219i-a lansat recent ultima versiune, <strong>dbplyr 2.6.0<\/strong>, care aduce noi tipuri de conexiuni prin ADBC \u0219i JDBC, suport complet pentru IBM DB2 \u0219i noi func\u021bii SQL. le vom detalia pe toate \u00een continuarea acestui articol.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">R sau SQL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Utilizatorul scrie codul exclusiv \u00een R, dar <strong>dbplyr<\/strong> \u00ee\u021bi ofer\u0103 flexibilitatea total\u0103 de a combina \u0219i cu SQL, dac\u0103 acesta are nevoie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dac\u0103 se opteaz\u0103 pentru interog\u0103ri \u00een SQL, <code>dbplyr<\/code> \u0219i pachetul p\u0103rinte <code>DBI<\/code> \u00ee\u021bi permit s\u0103 faci acest lucru \u00een dou\u0103 moduri:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sintax\u0103 mixt\u0103 (Func\u021bii SQL \u00een R):<\/strong> Po\u021bi folosi func\u021bii native din SQL direct \u00een interiorul codului t\u0103u de R. Dac\u0103 baza ta de date are o func\u021bie special\u0103 numit\u0103 <code>CONCAT_WS<\/code>, o po\u021bi scrie direct \u00een R, iar <code>dbplyr<\/code> o va trimite exact a\u0219a c\u0103tre server: <code>date_baza %&gt;% mutate(nume_complet = CONCAT_WS(\"-\", nume, prenume))<\/code><\/li>\n\n\n\n<li><strong>Interogare SQL pur\u0103:<\/strong> Po\u021bi folosi func\u021bia <code>dbGetQuery()<\/code> sau <code>tbl(conexiune, sql(\"SELECT * FROM...\"))<\/code> pentru a rula direct o interogare SQL clasic\u0103 scris\u0103 de la zero de c\u0103tre utilizator.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Scurt istoric al <code>dbplyr<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Istoria pachetului <strong>dbplyr<\/strong> este povestea modului \u00een care comunitatea R a reu\u0219it s\u0103 unifice analiza de date locale cu cea de pe servere masive.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u0103 vedem cele mai importante etape din istoria pachetului SQL \u00een R:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>Iunie 2017<\/em><\/strong> &#8211; <code>dbplyr<\/code> este lansat ca <strong>pachet de sine st\u0103t\u0103tor<\/strong>, cu versiunea 1.0.0; prin aceast\u0103 schimbare, pachetul principal (<code>dplyr<\/code>) a devenit mai u\u0219or \u0219i mai simplu de \u00eentre\u021binut, iar ambele pachete au putut fi dezvoltate mai rapid. Filozofia din spatele ecosistemului <code>tidyverse<\/code> este ca <strong>fiecare pachet s\u0103 fac\u0103 un singur lucru, dar s\u0103 \u00eel fac\u0103 perfect<\/strong>.<\/li>\n\n\n\n<li><strong><em>2018 \u0219i 2019<\/em><\/strong> &#8211; s-au lansat versiunile dbplyr 1.2.0 \u0219i 1.4.0, care au pus accentul pe corectitudinea traducerii din R \u00een SQL; de asemenea, a fost \u00eembun\u0103t\u0103\u021bit comportamentul func\u021biei <strong><code>window functions<\/code><\/strong> (cum ar fi <code>lead()<\/code>, <code>lag()<\/code>, <code>cumsum()<\/code>) pentru a genera clauze SQL de tipul <code>OVER (PARTITION BY...)<\/code> extrem de precise.<\/li>\n\n\n\n<li><strong><em>Noiembrie 2020<\/em><\/strong> &#8211; optimizatorul SQL a fost rescris \u00een versiunea 2.0.0; astfel, pachetul a devenit mult mai inteligent \u00een a evita interog\u0103rile imbricate inutile (subqueries), iar codul SQL generat a devenit curat, scurt \u0219i lizibil.<\/li>\n\n\n\n<li><strong><em>Ianuarie 2023<\/em><\/strong> &#8211; apare versiunea 2.3.0, cu suport pentru argumentul <code>.by<\/code> (<em>grupare din mers<\/em>), o preluare a uneia dintre cele mai mari nout\u0103\u021bi din <code>dplyr 1.1.0<\/code>; aceea\u0219i versiune a introdus clauzele CTE (<em>Common Table Expressions<\/em>), ca s\u0103 nu mai fie nevoie s\u0103 scrie <em>subqueries<\/em> \u00een <em>subqueries<\/em>, a \u00eenceput s\u0103 foloseasc\u0103 mult mai des structuri de tipul <code>WITH tabela_temporara AS (...)<\/code>; nu \u00een ultimul r\u00e2nd, versiunea 2.3.0 a ad\u0103ugat traduceri native pentru manipularea avansat\u0103 a datelor calendaristice \u0219i a timpului pentru pachetul <code>clock<\/code>.<\/li>\n\n\n\n<li><strong><em>Octombrie 2023<\/em><\/strong> &#8211; versiunea 2.4.0 s-a concetrat pe optimizarea func\u021biei <code>copy_to()<\/code> \u0219i a tabelelor temporare, mai bune pentru func\u021biile de text din pachetul <code>sringr<\/code> \u0219i pe suport complet pentru reordonarea coloanelor.<\/li>\n\n\n\n<li><strong><em>Aprilie 2024<\/em><\/strong> &#8211; apare versiunea 2.5.0, care a introdus standardul simplu: <code>tbl(con, I(\"schema.tabel\"))<\/code>, unde <code>I()<\/code> \u00eei spune pachetului s\u0103 trateze string-ul exact a\u0219a cum este scris.<\/li>\n\n\n\n<li><strong><em>Iunie 2026<\/em><\/strong> &#8211; apare 2.6.0, cea mai recent\u0103 versiune de <code>dbplyr<\/code>, care se concentreaz\u0103 pe interfe\u021be moderne de date \u0219i stabilitate, dup\u0103 cum vom vedea \u00een continuare.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Noi tipuri de conexiuni: ADBC \u0219i JDBC<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">P\u00e2n\u0103 acum, standardul de aur pentru conectarea la baze de date \u00een R prin <code>dbplyr<\/code> era pachetul <code>odbc<\/code>. Versiunea 2.6.0 adaug\u0103 suport nativ pentru:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ADBC (Arrow Database Connectivity):<\/strong> O tehnologie extrem de rapid\u0103 bazat\u0103 pe Apache Arrow, care eficientizeaz\u0103 masiv transferul de date masive (<em>bulk data transfer<\/em>) \u00eentre server \u0219i R.<\/li>\n\n\n\n<li><strong>JDBC (Java Database Connectivity):<\/strong> Ofer\u0103 o flexibilitate mai mare pentru sistemele care folosesc drivere bazate pe Java.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Suport complet pentru IBM DB2<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Datorit\u0103 contribu\u021biilor comunit\u0103\u021bii, <code>dbplyr<\/code> include acum un strat complet de traducere dedicat pentru <strong>IBM DB2<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Acesta traduce corect func\u021biile de concatenare (<code>paste()<\/code> devine <code>||<\/code>), cast-urile specifice DB2, generarea de numere aleatorii (<code>runif()<\/code>), func\u021biile de timp\/dat\u0103 (pachetul <code>clock<\/code>) \u0219i agregatele statistice complexe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Func\u021bia nou\u0103 <code>last_sql()<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">De multe ori, c\u00e2nd rulai o comand\u0103 precum <code>collect()<\/code> sau <code>compute()<\/code> \u0219i primeai o eroare direct din baza de date, era greu s\u0103 vezi ce anume a generat acea eroare f\u0103r\u0103 s\u0103 rescrii codul pentru <code>show_query()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Noua func\u021bie <strong><code>last_sql()<\/code><\/strong> \u00ee\u021bi returneaz\u0103 instant textul ultimei interog\u0103ri SQL generate de <code>dbplyr<\/code>, f\u0103c\u00e2nd debugging-ul mult mai simplu \u0219i rapid.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Op\u021biunea <code>copy = \"inline\"<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00cen mod normal, dac\u0103 voiai s\u0103 faci un <code>join<\/code> \u00eentre un tabel mic local (din memoria R) \u0219i un tabel uria\u0219 de pe server, <code>dbplyr<\/code> trebuia s\u0103 creeze un tabel temporar direct pe server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cu noua op\u021biune <code>copy = \"inline\"<\/code>, <code>dbplyr<\/code> poate injecta datele locale <strong>direct \u00een textul interog\u0103rii SQL<\/strong> (folosind clauze de tip <code>VALUES<\/code>), f\u0103r\u0103 a mai fi nevoie s\u0103 ai drepturi de scriere pentru a crea tabele temporare pe serverul bazei de date.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Decuplare mai bun\u0103 a dialectelor SQL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">S-a introdus o nou\u0103 component\u0103 intern\u0103 numit\u0103 <code>sql_dialect()<\/code>, care separ\u0103 logica conexiunii fizice de dialectul SQL folosit. Acest lucru permite dezvoltatorilor de pachete R s\u0103 creeze mult mai u\u0219or extensii adaptate pentru baze de date personalizate sau mai pu\u021bin populare.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aceea\u0219i func\u021bie faciliteaz\u0103 integrarea cu noile conexiuni ultra-rapide bazate pe Apache Arrow (ADBC). Driverul Arrow doar transport\u0103 datele, iar <code>sql_dialect()<\/code> se asigur\u0103 c\u0103 interog\u0103rile transmise sunt scrise \u00een limba corect\u0103 a bazei de date \u021bint\u0103.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>dbplyr 2.6.0<\/strong> a venit cu multe func\u021bionalit\u0103\u021bi noi pentru utilizatori \u0219i pentru c\u0103 multe bug-uri istorice din versiunile anteroiare ale pachetului au fost cur\u0103\u021bate rapid \u00een aceast\u0103 versiune cu ajutorul instrumentelor de inteligen\u021b\u0103 artificial\u0103 pentru cod.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>dbplyr este un pachet extrem de puternic din ecosistemul tidyverse al limbajului R. Acesta permite folosirea sintaxei dplyr direct pe baze de date. Utilizatorul poate s\u0103 scrie codul \u00een limbajul R (filter, select, mutate, group_by, summarise etc.), iar dbplyr \u00eel traduce automat \u00een SQL \u0219i \u00eel ruleaz\u0103 \u00een baza de date, f\u0103r\u0103 s\u0103 \u00eencarci datele [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4363,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,11,12],"tags":[843,992],"class_list":["post-4362","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","category-noutati","category-technical","tag-r","tag-sql"],"_links":{"self":[{"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/posts\/4362","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/comments?post=4362"}],"version-history":[{"count":2,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/posts\/4362\/revisions"}],"predecessor-version":[{"id":4367,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/posts\/4362\/revisions\/4367"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/media\/4363"}],"wp:attachment":[{"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/media?parent=4362"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/categories?post=4362"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/tags?post=4362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}