Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2020-01-17T16:53:58+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Multi tenant Django, message #2139362020-01-17T16:53:58+01:00azeupaul/@azeupaulhttps://zestedesavoir.com/forums/sujet/13509/multi-tenant-django/?page=1#p213936<p>Bonsoir, </p>
<p>Je viens vers vous avec un problème auquel je fais face depuis quelques jours sous un environnement <strong>multi schéma</strong> de base de données. </p>
<p>Tout vient de l’architecture, je travaille sous une application qui met en place le <strong>multitenant</strong> et plus précisément une base de données avec plusieurs schémas sous postgresql qui le supporte assez bien et je développe l’application sous Django (une API en fait). </p>
<p>J’ai donc un modèle <strong>Type</strong> qui est relié à plusieurs autres modèles, pour mon exemple ici je prendrais un seul modèle à l’instar de <strong>Ressource</strong> (chaque modèle possède un <strong>Type</strong>)</p>
<p>Pour le moment, j’ai développé l’application de telle sorte que chaque client (qui représente un schéma privé) puisse enregistré ses types et ses ressources et cela se passe sans soucis. </p>
<p>Il faudrait pouvoir donner la possibilité à l’administration (donc nous) qui opérons sur le schéma public de pouvoir créer aussi des types d’où j’ai créé un nouveau modèle Type (dans le schéma public) et nous renseignons les valeurs aussi sans problème. </p>
<p>Le véritable problème commence ici, il faudrait que chaque client lorsqu’il récupère la liste des types puissent avoir accès à ses types mais aussi à ceux que l’administration à créer mais sans pouvoir les modifier, ni supprimer etc… Juste de la visualisation des types créés par l’admin. Je suppose que je peux faire ceci via une requête UNION en base de données (vu que les 2 tables sont identiques) et ensuite ajouter un ou 2 champs pour informer le front de la provenance du type. </p>
<p>Par contre la seconde partie, je ne sais pas comment la résoudre: la relation entre le type et la ressource. Vu qu’il peut à la fois être relié à un type du schéma privé ou alors un type du schéma public. </p>
<p>Comment résoudre ce problème sachant que je ne peux pas </p>
<ul>
<li>Définir un seul type (dans le schéma public) et ajouter un champ permettant de distinguer les types de chaque client pour empêcher la lecture d’un autre client</li>
<li>Importer les types du schéma public vers le schéma privé, car comment cela va t’il se passer en cas de modification (ou suppression) d’un type du schéma public qui a été importé dans un schéma privé.</li>
</ul>
<p>Je m’en remets à vous pour des pistes. </p>
<p>Merci de votre aide. </p>[ndb] Interface générique pour SGBD en C++17, message #2081072019-09-02T15:58:26+02:00ads00/@ads00https://zestedesavoir.com/forums/sujet/10683/ndb-interface-generique-pour-sgbd-en-c17/?page=1#p208107<p>Salut,
J’ai ajouté un système de variables persistantes qui permettent par exemple de créer des sauvegardes de configuration.</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-cpp"><span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">browser</span> :</span> ndb::persistent_group
{
<span class="hljs-keyword">using</span> persistent_group::persistent_group;
ndb::persistent<<span class="hljs-built_in">std</span>::<span class="hljs-built_in">string</span>> home{ <span class="hljs-keyword">this</span>, <span class="hljs-string">"home"</span>, <span class="hljs-string">"www.google.fr"</span> };
<span class="hljs-class"><span class="hljs-keyword">struct</span> :</span> ndb::persistent_group
{
<span class="hljs-keyword">using</span> persistent_group::persistent_group;
ndb::persistent<<span class="hljs-keyword">bool</span>> auto_load{ <span class="hljs-keyword">this</span>, <span class="hljs-string">"auto_load"</span>, <span class="hljs-literal">false</span> };
ndb::persistent<<span class="hljs-keyword">int</span>> history_size{ <span class="hljs-keyword">this</span>, <span class="hljs-string">"history_size"</span>, <span class="hljs-number">10</span> };
} tabs{ <span class="hljs-keyword">this</span>, <span class="hljs-string">"tabs"</span> };
};
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>
</span>{
ndb::initializer<ndb::sqlite> init;
::browser browser{ <span class="hljs-string">"browser"</span> };
<span class="hljs-built_in">std</span>::<span class="hljs-built_in">cout</span> << <span class="hljs-string">"\n"</span> << browser.home.path() << <span class="hljs-string">" : "</span> << browser.home.get();
<span class="hljs-built_in">std</span>::<span class="hljs-built_in">cout</span> << <span class="hljs-string">"\n"</span> << browser.tabs.auto_load.path() << <span class="hljs-string">" : "</span> << browser.tabs.auto_load.get();
<span class="hljs-built_in">std</span>::<span class="hljs-built_in">cout</span> << <span class="hljs-string">"\n"</span> << browser.tabs.history_size.path() << <span class="hljs-string">" : "</span> << browser.tabs.history_size.get();
browser.home = <span class="hljs-string">"https://zestedesavoir.com"</span>;
browser.tabs.auto_load = <span class="hljs-literal">true</span>;
browser.tabs.history_size = <span class="hljs-number">200</span>;
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</code></pre></div>
<p>1ère exécution : </p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span></div><pre><code class="hljs language-stylus">browser<span class="hljs-selector-class">.home</span> : www<span class="hljs-selector-class">.google</span><span class="hljs-selector-class">.fr</span>
browser<span class="hljs-selector-class">.tabs</span><span class="hljs-selector-class">.auto_load</span> : <span class="hljs-number">0</span>
browser<span class="hljs-selector-class">.tabs</span><span class="hljs-selector-class">.history_size</span> : <span class="hljs-number">10</span>
</code></pre></div>
<p>Exécutions suivantes : </p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span></div><pre><code class="hljs language-stylus">browser<span class="hljs-selector-class">.home</span> : https:<span class="hljs-comment">//zestedesavoir.com</span>
browser<span class="hljs-selector-class">.tabs</span><span class="hljs-selector-class">.auto_load</span> : <span class="hljs-number">1</span>
browser<span class="hljs-selector-class">.tabs</span><span class="hljs-selector-class">.history_size</span> : <span class="hljs-number">200</span>
</code></pre></div>
<p>Exemple complet : <a href="https://github.com/ads00/ndb/blob/dev/example/persistent.cpp">https://github.com/ads00/ndb/blob/dev/example/persistent.cpp</a></p>[ndb] Interface générique pour SGBD en C++17, message #2041042019-05-31T22:18:11+02:00ads00/@ads00https://zestedesavoir.com/forums/sujet/10683/ndb-interface-generique-pour-sgbd-en-c17/?page=1#p204104<p>Salut,</p>
<p>La gestion des objets a été ajoutée, ça ressemble à ça</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-cpp">::movie interstellar{ <span class="hljs-string">"params"</span> };
interstellar.name = <span class="hljs-string">"Interstellar"</span>;
interstellar.duration = <span class="hljs-number">2.49</span>h;
ndb::store(interstellar);
::movie movie{<span class="hljs-string">"params"</span>};
ndb::load(movie, interstellar.oid);
movie.display();
movie.edit();
ndb::store(movie);
<span class="hljs-keyword">auto</span> edited_movie = ndb::make<::movie>(movie.oid, <span class="hljs-string">"params"</span>);
edited_movie.display();
ndb::unload(interstellar);
interstellar.display();
</code></pre></div>
<p>L’exemple complet se trouve ici : <a href="https://github.com/ads00/ndb/blob/dev/example/object.cpp">https://github.com/ads00/ndb/blob/dev/example/object.cpp</a></p>[ndb] Interface générique pour SGBD en C++17, message #2026232019-05-02T20:35:51+02:00ads00/@ads00https://zestedesavoir.com/forums/sujet/10683/ndb-interface-generique-pour-sgbd-en-c17/?page=1#p202623<p>Salut,</p>
<ul>
<li>Les requêtes préparées sont prêtes !</li>
</ul>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span></div><pre><code class="hljs language-cpp"> ndb_prepare(get_movie) << (ndb::get()
<< ndb::source(movie)
<< ndb::filter(movie.duration == _ || movie.name == _));
</code></pre></div>
<ul>
<li>La limite du nombre de champs a été levées.</li>
<li>On peut définir un type de retour pour les expressions</li>
<li>Les alias sont prêts !</li>
</ul>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-cpp">ndb_alias(count_id, ndb::count(movie.id));
ndb_alias(count_name, ndb::count(movie.name));
<span class="hljs-keyword">auto</span> q = (
ndb::get(
movie.id, movie.name, movie.duration
, count_id
, count_name)
<< ndb::source(movie)
);
...
<span class="hljs-built_in">std</span>::<span class="hljs-built_in">cout</span> << <span class="hljs-string">"count_id : "</span> << line[count_id] << <span class="hljs-built_in">std</span>::<span class="hljs-built_in">endl</span>;
</code></pre></div>[ndb] Interface générique pour SGBD en C++17, message #1993972019-02-22T18:50:28+01:00ads00/@ads00https://zestedesavoir.com/forums/sujet/10683/ndb-interface-generique-pour-sgbd-en-c17/?page=1#p199397<p>Salut,</p>
<p>Il est désormais possible d’ajouter des options à la création des tables.</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-cpp">ndb_table(movie
, ndb_field_id
, ndb_field(name, <span class="hljs-built_in">std</span>::<span class="hljs-built_in">string</span>, ndb::size<<span class="hljs-number">255</span>>, ndb::option<ndb::field_option::unique>)
, ndb_field(duration, <span class="hljs-built_in">std</span>::chrono::duration<<span class="hljs-keyword">double</span>, <span class="hljs-built_in">std</span>::ratio<<span class="hljs-number">3600</span>>>)
, ndb_option(ndb::table_option::unique<name_, duration_>)
</code></pre></div>
<p>La gestion des relations se fera par une interface orientée graph mais permettra de gérer n’importe quel type de SGBD.</p>
<p>Ca devrait ressembler à ça, je ne sais pas encore si le style Cypher sera implémenté.</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-cpp"><span class="hljs-comment">// cypher</span>
ndb::query<dbs::library>() << (ndb::get() << ndb::relation(user - user.arcs.possess -> music || user - user.arcs.like - music) << ndb::filter(user.name == <span class="hljs-string">"ads"</span>s))
<span class="hljs-comment">// fonctionnel</span>
ndb::query<dbs::library>() << (ndb::get() << ndb::relation(ndb::arc(user, music, user.arcs.possess) || ndb::edge(user, music, user.arcs.like)) << ndb::filter(user.name == <span class="hljs-string">"ads"</span>s))
</code></pre></div>[ndb] Interface générique pour SGBD en C++17, message #1931782018-11-17T09:58:42+01:00ads00/@ads00https://zestedesavoir.com/forums/sujet/10683/ndb-interface-generique-pour-sgbd-en-c17/?page=1#p193178<p>Salut,</p>
<p>Quelques news concernant la prochaine version.</p>
<p>La syntaxe va légèrement changer pour devenir plus explicite (tout en restant générique) et permettre la construction de requêtes dynamiques et préparées.</p>
<p>La déduction sera mise de côté, c’est une feature qui demande plus d’opérations à la compilation (ce qui peut gêner les gens qui n’ont pas de supercalculateur) et qui demande plus de temps de maintenance (principalement à cause de msvc).</p>
<p>La feature sera peut-être rajouter plus tard mais de manière optionnelle.</p>
<p>J’ajouterai à la place plus de fonctions utilitaires permettant d’effectuer des requêtes standards.</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-cpp"><span class="hljs-keyword">constexpr</span> <span class="hljs-keyword">auto</span> expr = ndb::statement << ndb::del << ndb::source(movie) << ndb::filter(movie.id == <span class="hljs-number">3</span>);
ndb::dynamic_statement<db> stmt;
stmt << ndb::get(movie.id, movie.name) << ndb::source(movie) << ndb::filter;
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < <span class="hljs-number">3</span>; ++i)
{
stmt << (movie.id == <span class="hljs-number">3</span>);
<span class="hljs-keyword">if</span> (i < <span class="hljs-number">3</span> - <span class="hljs-number">1</span>) stmt << ndb::logical_and;
}
<span class="hljs-built_in">std</span>::<span class="hljs-built_in">cout</span> << <span class="hljs-string">"\ndyn output : "</span> << stmt.native();
</code></pre></div>[ndb] Interface générique pour SGBD en C++17, message #1833162018-07-08T13:30:50+02:00ads00/@ads00https://zestedesavoir.com/forums/sujet/10683/ndb-interface-generique-pour-sgbd-en-c17/?page=1#p183316<p>Salut,</p>
<p>Je suis en train de refaire la partie expressions dans le but d’ajouter les alias, les requêtes préparées, les formes d’expressions et les requêtes dynamiques.</p>
<p>Je cherche quelqu’un qui serait intéressé par l’implémentation de l’interface pour un moteur de stockage utilisant des expressions différentes de SQL comme bson ou même un moteur qui effectue les opérations de l’expression directement sur le moteur (un tuple engine par exemple)</p>
<p>Si ça vous intéresse, contactez moi !</p>[ndb] Interface générique pour SGBD en C++17, message #1805312018-05-19T04:01:16+02:00ads00/@ads00https://zestedesavoir.com/forums/sujet/10683/ndb-interface-generique-pour-sgbd-en-c17/?page=1#p180531<p>Salut,</p>
<p>Nouvelle feature (bientôt complète), les <strong>oquery </strong>(object query)</p>
<p>Prenons la <strong><em>table movie</em></strong>, on peut désormais récupérer un <strong><em>objet movie</em></strong> depuis une requête </p>
<p>La génération sera automatique demain, il suffira donc de remplacer <code>ndb::query</code> par <code>ndb::oquery</code> pour avoir un objet à la place d’une ligne.</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7
8</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">auto</span> <span class="p">[</span><span class="n">interstellar</span><span class="p">]</span> <span class="o">=</span> <span class="n">ndb</span><span class="o">::</span><span class="n">oquery</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">library</span><span class="o">></span><span class="p">()</span> <span class="o"><<</span> <span class="p">(</span><span class="n">movie</span><span class="p">.</span><span class="n">id</span> <span class="o">==</span> <span class="mi">1</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">interstellar</span><span class="p">.</span><span class="n">id</span> <span class="o"><<</span> <span class="s">" | "</span> <span class="o"><<</span> <span class="n">interstellar</span><span class="p">.</span><span class="n">name</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="k">auto</span> <span class="p">[</span><span class="n">id</span><span class="p">,</span> <span class="n">name</span><span class="p">]</span> <span class="o">:</span> <span class="n">ndb</span><span class="o">::</span><span class="n">oquery</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">library</span><span class="o">></span><span class="p">()</span> <span class="o"><<</span> <span class="n">movie</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"id : "</span> <span class="o"><<</span> <span class="n">id</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"name : "</span> <span class="o"><<</span> <span class="n">name</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
<p>Ce qui donne : </p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="go">1 | Interstellar</span>
<span class="go">id : 1</span>
<span class="go">name : Interstellar</span>
<span class="go">id : 2</span>
<span class="go">name : Watchmen</span>
</pre></div>
</td></tr></table></div>[ndb] Interface générique pour SGBD en C++17, message #1803932018-05-17T03:14:28+02:00ads00/@ads00https://zestedesavoir.com/forums/sujet/10683/ndb-interface-generique-pour-sgbd-en-c17/?page=1#p180393<p>Salut,</p>
<p>Voici un exemple complet fonctionnel qui montre l’utilisation de type custom</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="cp">#include</span> <span class="cpf"><ndb/initializer.hpp></span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><ndb/engine/sqlite/sqlite.hpp> // engine</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><ndb/preprocessor.hpp> // database macros</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><ndb/function.hpp> // ndb::clear</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><ndb/query.hpp> // query and expression</span><span class="cp"></span>
<span class="cm">/*! Generate database entities (instances, structures etc ...)</span>
<span class="cm"> * Entites are generated in namespaces ndb::models, ndb::tables, ndb::databases::my_project</span>
<span class="cm"> * Add _ to the name tu use the type (example : ndb::tables::movie_)</span>
<span class="cm"> */</span>
<span class="c1">// database</span>
<span class="n">ndb_table</span><span class="p">(</span><span class="n">movie</span><span class="p">,</span>
<span class="n">ndb_field_id</span><span class="p">,</span>
<span class="n">ndb_field</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">,</span> <span class="n">ndb</span><span class="o">::</span><span class="n">size</span><span class="o"><</span><span class="mi">255</span><span class="o">></span><span class="p">),</span>
<span class="n">ndb_field</span><span class="p">(</span><span class="n">duration</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">duration</span><span class="o"><</span><span class="kt">double</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">ratio</span><span class="o"><</span><span class="mi">3600</span><span class="o">>></span><span class="p">)</span>
<span class="p">)</span>
<span class="n">ndb_table</span><span class="p">(</span><span class="n">music</span><span class="p">,</span>
<span class="n">ndb_field</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="kt">int</span><span class="p">),</span>
<span class="n">ndb_field</span><span class="p">(</span><span class="n">image</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">ndb_model</span><span class="p">(</span><span class="n">library</span><span class="p">,</span> <span class="n">movie</span><span class="p">,</span> <span class="n">music</span><span class="p">)</span>
<span class="n">ndb_project</span><span class="p">(</span><span class="n">my_project</span><span class="p">,</span>
<span class="n">ndb_database</span><span class="p">(</span><span class="n">library</span><span class="p">,</span> <span class="n">library</span><span class="p">,</span> <span class="n">ndb</span><span class="o">::</span><span class="n">sqlite</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1">// alias</span>
<span class="k">namespace</span> <span class="n">dbs</span>
<span class="p">{</span>
<span class="k">using</span> <span class="n">library</span> <span class="o">=</span> <span class="n">ndb</span><span class="o">::</span><span class="n">databases</span><span class="o">::</span><span class="n">my_project</span><span class="o">::</span><span class="n">library_</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="o">::</span><span class="n">chrono_literals</span><span class="p">;</span>
<span class="k">const</span> <span class="k">auto</span><span class="o">&</span> <span class="n">movie</span> <span class="o">=</span> <span class="n">ndb</span><span class="o">::</span><span class="n">models</span><span class="o">::</span><span class="n">library</span><span class="p">.</span><span class="n">movie</span><span class="p">;</span>
<span class="n">ndb</span><span class="o">::</span><span class="n">initializer</span><span class="o"><</span><span class="n">ndb</span><span class="o">::</span><span class="n">sqlite</span><span class="o">></span> <span class="n">init</span><span class="p">;</span>
<span class="c1">//! connect to database library</span>
<span class="n">ndb</span><span class="o">::</span><span class="n">connect</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">library</span><span class="o">></span><span class="p">();</span>
<span class="c1">//! clear movie table</span>
<span class="n">ndb</span><span class="o">::</span><span class="n">clear</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">library</span><span class="o">></span><span class="p">(</span><span class="n">movie</span><span class="p">);</span>
<span class="c1">//! add records</span>
<span class="n">ndb</span><span class="o">::</span><span class="n">query</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">library</span><span class="o">></span><span class="p">()</span> <span class="o">+</span> <span class="p">(</span><span class="n">movie</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">"Interstellar"</span><span class="p">,</span> <span class="n">movie</span><span class="p">.</span><span class="n">duration</span> <span class="o">=</span> <span class="mf">2.49</span><span class="n">h</span><span class="p">);</span>
<span class="n">ndb</span><span class="o">::</span><span class="n">query</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">library</span><span class="o">></span><span class="p">()</span> <span class="o">+</span> <span class="p">(</span><span class="n">movie</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">"Watchmen"</span><span class="p">,</span> <span class="n">movie</span><span class="p">.</span><span class="n">duration</span> <span class="o">=</span> <span class="mf">3.30</span><span class="n">h</span><span class="p">);</span>
<span class="c1">//! get movie with specified duration</span>
<span class="c1">//! missing informations of the query are deduced compile time</span>
<span class="c1">//! for SQL-like engines, the string is generated compile time</span>
<span class="k">for</span> <span class="p">(</span><span class="k">auto</span><span class="o">&</span> <span class="nl">line</span> <span class="p">:</span> <span class="n">ndb</span><span class="o">::</span><span class="n">query</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">library</span><span class="o">></span><span class="p">()</span> <span class="o"><<</span> <span class="p">(</span><span class="n">movie</span><span class="p">.</span><span class="n">duration</span> <span class="o">==</span> <span class="mf">3.30</span><span class="n">h</span><span class="p">))</span>
<span class="p">{</span>
<span class="c1">//! access fields from result using field name</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"movie.id : "</span> <span class="o"><<</span> <span class="n">line</span><span class="p">[</span><span class="n">movie</span><span class="p">.</span><span class="n">id</span><span class="p">]</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"movie.name : "</span> <span class="o"><<</span> <span class="n">line</span><span class="p">[</span><span class="n">movie</span><span class="p">.</span><span class="n">name</span><span class="p">]</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"movie.duration : "</span> <span class="o"><<</span> <span class="n">line</span><span class="p">[</span><span class="n">movie</span><span class="p">.</span><span class="n">duration</span><span class="p">].</span><span class="n">count</span><span class="p">()</span> <span class="o"><<</span> <span class="s">" Hours"</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>[ndb] Interface générique pour SGBD en C++17, message #1795762018-05-04T01:40:48+02:00ads00/@ads00https://zestedesavoir.com/forums/sujet/10683/ndb-interface-generique-pour-sgbd-en-c17/?page=1#p179576<p>Salut !</p>
<p><strong>ndb</strong> est une interface générique qui permet de se connecter à n’importe quel moteur de données (SGBD ou autre)
Les requêtes sont écrites en C++ et peuvent être exécutées sur différents moteurs de données en changeant un seul paramètre.
Les modèles de données sont définis et accessibles compile-time . MySQL et MongoDB sont encore en cours de dev/test.</p>
<p>Tester : <a href="https://github.com/ads00/ndb">https://github.com/ads00/ndb</a></p>
<h3>Features</h3>
<ul>
<li><strong>Header only</strong></li>
<li>Requêtes full <strong>C++</strong> et <strong>génériques</strong></li>
<li>Support de <strong>tout type</strong> de <strong>moteur de données</strong></li>
<li><strong>Expressions SQL</strong> générées <strong>compile-time</strong></li>
<li>Gestion des <strong>types personnalisable</strong></li>
<li><strong>Accès aux champ</strong>s via des <strong>structures</strong></li>
<li><strong>Déduction d’expressions</strong> partielles</li>
</ul>
<h3>Exemple</h3>
<h4>Database (avec macros)</h4>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="n">ndb_table</span><span class="p">(</span><span class="n">movie</span><span class="p">,</span>
<span class="n">ndb_field</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="kt">int</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
<span class="n">ndb_field</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">,</span> <span class="mi">255</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">ndb_table</span><span class="p">(</span><span class="n">music</span><span class="p">,</span>
<span class="n">ndb_field</span><span class="p">(</span><span class="n">id</span><span class="p">,</span> <span class="kt">int</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
<span class="n">ndb_field</span><span class="p">(</span><span class="n">image</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">,</span> <span class="mi">255</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">ndb_model</span><span class="p">(</span><span class="n">library</span><span class="p">,</span> <span class="n">movie</span><span class="p">,</span> <span class="n">music</span><span class="p">)</span>
<span class="n">ndb_project</span><span class="p">(</span><span class="n">my_project</span><span class="p">,</span>
<span class="n">ndb_database</span><span class="p">(</span><span class="n">alpha</span><span class="p">,</span> <span class="n">library</span><span class="p">,</span> <span class="n">ndb</span><span class="o">::</span><span class="n">sqlite</span><span class="p">),</span>
<span class="n">ndb_database</span><span class="p">(</span><span class="n">zeta</span><span class="p">,</span> <span class="n">library</span><span class="p">,</span> <span class="n">ndb</span><span class="o">::</span><span class="n">mongo</span><span class="p">)</span>
<span class="p">)</span>
</pre></div>
</td></tr></table></div>
<h4>Requêtes</h4>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="n">ndb</span><span class="o">::</span><span class="n">query</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">zeta</span><span class="o">></span><span class="p">()</span> <span class="o"><<</span> <span class="p">(</span> <span class="n">movie</span><span class="p">.</span><span class="n">id</span><span class="p">,</span> <span class="n">movie</span><span class="p">.</span><span class="n">image</span> <span class="p">);</span> <span class="c1">// get</span>
<span class="n">ndb</span><span class="o">::</span><span class="n">query</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">zeta</span><span class="o">></span><span class="p">()</span> <span class="o"><<</span> <span class="p">(</span> <span class="n">movie</span><span class="p">.</span><span class="n">id</span> <span class="o">==</span> <span class="n">a</span> <span class="o">&&</span> <span class="n">movie</span><span class="p">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">b</span> <span class="p">);</span> <span class="c1">// get all par condition</span>
<span class="n">ndb</span><span class="o">::</span><span class="n">query</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">zeta</span><span class="o">></span><span class="p">()</span> <span class="o">+</span> <span class="p">(</span> <span class="n">movie</span><span class="p">.</span><span class="n">id</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">movie</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">"test"</span> <span class="p">);</span> <span class="c1">// add</span>
<span class="n">ndb</span><span class="o">::</span><span class="n">query</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">zeta</span><span class="o">></span><span class="p">()</span> <span class="o">-</span> <span class="p">(</span> <span class="n">movie</span><span class="p">.</span><span class="n">id</span> <span class="o">==</span> <span class="mi">3</span> <span class="p">);</span> <span class="c1">// del</span>
</pre></div>
</td></tr></table></div>
<h4>Résultats</h4>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">for</span> <span class="p">(</span><span class="k">auto</span><span class="o">&</span> <span class="nl">line</span> <span class="p">:</span> <span class="n">ndb</span><span class="o">::</span><span class="n">query</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">zeta</span><span class="o">></span><span class="p">()</span> <span class="o"><<</span> <span class="p">(</span><span class="n">movie</span><span class="p">.</span><span class="n">id</span><span class="p">,</span> <span class="n">movie</span><span class="p">.</span><span class="n">name</span><span class="p">)</span> <span class="p">)</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">ID : "</span> <span class="o"><<</span> <span class="n">line</span><span class="p">[</span><span class="n">movie</span><span class="p">.</span><span class="n">id</span><span class="p">];</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">Name : "</span> <span class="o"><<</span> <span class="n">line</span><span class="p">[</span><span class="n">movie</span><span class="p">.</span><span class="n">name</span><span class="p">];</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
<h4>Minimal</h4>
<p>Un exemple avec une base de donnée <em>libray</em> en utilisant le modèle <em>collection</em> et une table <em>movie</em></p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="cp">#include</span> <span class="cpf">"my_database.h"</span><span class="cp"></span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">const</span> <span class="k">auto</span><span class="o">&</span> <span class="n">movie</span> <span class="o">=</span> <span class="n">ndb</span><span class="o">::</span><span class="n">models</span><span class="o">::</span><span class="n">collection</span><span class="p">.</span><span class="n">movie</span><span class="p">;</span> <span class="c1">// alias</span>
<span class="n">ndb</span><span class="o">::</span><span class="n">initializer</span><span class="o"><</span><span class="n">ndb</span><span class="o">::</span><span class="n">sqlite</span><span class="o">></span> <span class="n">init</span><span class="p">;</span>
<span class="n">ndb</span><span class="o">::</span><span class="n">connect</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">library</span><span class="o">></span><span class="p">();</span>
<span class="n">ndb</span><span class="o">::</span><span class="n">query</span><span class="o"><</span><span class="n">dbs</span><span class="o">::</span><span class="n">library</span><span class="o">></span><span class="p">()</span> <span class="o">+</span> <span class="p">(</span><span class="n">movie</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">"Interstellar"</span><span class="p">,</span> <span class="n">movie</span><span class="p">.</span><span class="n">duration</span> <span class="o">=</span> <span class="mf">2.49</span><span class="n">_h</span><span class="p">)</span> <span class="p">);</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>