{"id":9558,"date":"2023-01-03T17:05:02","date_gmt":"2023-01-03T16:05:02","guid":{"rendered":"https:\/\/blog.capdata.fr\/?p=9558"},"modified":"2023-01-19T11:28:01","modified_gmt":"2023-01-19T10:28:01","slug":"pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/","title":{"rendered":"Pyrseas et Postgresql : Comparer facilement des sch\u00e9mas de base de donn\u00e9es"},"content":{"rendered":"<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F9558&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F9558&#038;title=Pyrseas%20et%20Postgresql%20%3A%20Comparer%20facilement%20des%20sch%C3%A9mas%20de%20base%20de%20donn%C3%A9es\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Pyrseas%20et%20Postgresql%20%3A%20Comparer%20facilement%20des%20sch%C3%A9mas%20de%20base%20de%20donn%C3%A9es&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F9558\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a><p>S&#8217;il vous est d\u00e9j\u00e0 arriv\u00e9 par le pass\u00e9 de faire du run avec deux bases diff\u00e9rentes (une de production et une de qualification par exemple) qui ne sont pas mises \u00e0 jour automatiquement par un outil de publication.<\/p>\n<p>Comparer deux bases de donn\u00e9es rel\u00e8ve alors du domaine du parcours du combattant. Comment \u00eatre s\u00fbr que tous nos objets de bases de donn\u00e9es sont exactement identiques ?<br \/>\nEt s&#8217;ils ne le sont pas, comment facilement remettre d&#8217;\u00e9querre le sch\u00e9ma pour qu&#8217;il soit identique sur les deux environnements ?<br \/>\nIl existe une extension de Postgresql pour \u00e7a. Elle s&#8217;appelle <a href=\"https:\/\/github.com\/perseas\/Pyrseas\">Pyrseas<\/a>. Cette extension permet de g\u00e9n\u00e9rer le sch\u00e9ma de votre base de donn\u00e9es au format YAML et se charge lui-m\u00eame de le comparer avec un autre et de g\u00e9n\u00e9rer des scripts de mise \u00e0 jour pour naviguer d&#8217;un sch\u00e9ma \u00e0 l&#8217;autre.<\/p>\n<p>Pour prouver son efficacit\u00e9, nous allons r\u00e9aliser un test avec deux bases de donn\u00e9es que nous allons comparer.<\/p>\n<p>&nbsp;<\/p>\n<h3>Premi\u00e8re \u00e9tape : Installer un PostgreSQL 14 sur notre machine<\/h3>\n<p>&nbsp;<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">root:~#sudo apt update &amp;amp;&amp;amp; sudo apt upgrade\r\nroot:~#sudo apt -y install gnupg2 wget vim\r\nroot:~#sudo sh -c 'echo &quot;deb http:\/\/apt.postgresql.org\/pub\/repos\/apt $(lsb_release -cs)-pgdg main&quot; &amp;gt; \/etc\/apt\/sources.list.d\/pgdg.list'\r\nroot:~#wget --quiet -O - https:\/\/www.postgresql.org\/media\/keys\/ACCC4CF8.asc | sudo apt-key add -\r\nroot:~#sudo apt -y update\r\nroot:~#sudo apt -y install postgresql-14<\/pre>\n<p>&nbsp;<\/p>\n<p>Une fois que notre instance est install\u00e9e et fonctionnelle, on va cr\u00e9er dessus deux bases de donn\u00e9es. Le but ici est de g\u00e9n\u00e9rer deux bases de donn\u00e9es quasiment identiques \u00e0 l&#8217;exception d&#8217;une petite chose (par exemple un type de donn\u00e9e diff\u00e9rent entre les deux bases sur la m\u00eame table).<\/p>\n<p>On cr\u00e9e notre premi\u00e8re base de donn\u00e9es :<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">root@ip-172-44-2-57:~# su - postgres\r\npostgres@ip-172-44-2-57:~$ psql\r\npsql (14.6 (Ubuntu 14.6-1.pgdg22.04+1))\r\nType &quot;help&quot; for help.<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">postgres=# create database test;\r\nCREATE DATABASE\r\npostgres=# \\c test\r\nYou are now connected to database &quot;test&quot; as user &quot;postgres&quot;.\r\ntest=# create table client ( id integer primary key, name varchar(20), phone varchar(20));\r\nCREATE TABLE<\/pre>\n<p>&nbsp;<\/p>\n<p>Puis la deuxi\u00e8me :<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">postgres=# create database test2;\r\nCREATE DATABASE\r\npostgres=# \\c test2\r\nYou are now connected to database &quot;test2&quot; as user &quot;postgres&quot;.\r\ntest2=# create table client ( id integer primary key, name varchar(20), phone integer);\r\nCREATE TABLE<\/pre>\n<h3><\/h3>\n<h3>Deuxi\u00e8me partie : Installer notre extension<\/h3>\n<p>&nbsp;<\/p>\n<p>La documentation de l&#8217;extension est disponible \u00e0 cette adresse : <a href=\"https:\/\/pyrseas.readthedocs.io\/en\/latest\/#\">documentation<\/a><\/p>\n<p>On commence par t\u00e9l\u00e9charger les sources :<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">root:~$ git clone https:\/\/github.com\/perseas\/Pyrseas.git\r\nCloning into 'Pyrseas'...\r\nremote: Enumerating objects: 6590, done.\r\nremote: Counting objects: 100% (271\/271), done.\r\nremote: Compressing objects: 100% (174\/174), done.\r\nremote: Total 6590 (delta 140), reused 175 (delta 88), pack-reused 6319\r\nReceiving objects: 100% (6590\/6590), 3.10 MiB | 13.02 MiB\/s, done.\r\nResolving deltas: 100% (4707\/4707), done.<\/pre>\n<p>&nbsp;<\/p>\n<p>On se positionne ensuite dans le dossier et on installe l&#8217;extension :<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">root:~$ cd Pyrseas\r\nroot:~\/Pyrseas# sudo python3 setup.py install\r\n...\r\nInstalled \/usr\/local\/lib\/python3.10\/dist-packages\/typing_extensions-4.4.0-py3.10.egg\r\nSearching for PyYAML==5.4.1\r\nBest match: PyYAML 5.4.1\r\nAdding PyYAML 5.4.1 to easy-install.pth file\r\n\r\nUsing \/usr\/lib\/python3\/dist-packages\r\nFinished processing dependencies for Pyrseas==0.10.0<\/pre>\n<h3><\/h3>\n<h3>Troisi\u00e8me \u00e9tape : Faire des tests !<\/h3>\n<p>&nbsp;<\/p>\n<p>Une fois que notre extension est install\u00e9e, il ne nous reste plus qu&#8217;\u00e0 l&#8217;utiliser.<br \/>\nPour faire ceci, il faut appeler les diff\u00e9rentes fonctions de l&#8217;extension.<\/p>\n<p>On commence par sortir un fichier YAML de notre base test, pour cela on utilise la fonction dbtoyaml fournie par pyrseas :<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">postgres:\/etc\/Pyrseas\/pyrseas$ python3 dbtoyaml.py  test &amp;gt; $HOME\/test.yaml\r\npostgres:\/etc\/Pyrseas\/pyrseas$ cd $HOME\r\npostgres:~$ ls -l\r\ntotal 12\r\n-rw-rw-r-- 1 postgres postgres  518 Dec  9 09:27 test.yaml\r\npostgres:~$ vi test.yaml<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le r\u00e9sultat obtenu quand on visualise le fichier yaml g\u00e9n\u00e9r\u00e9 :<\/p>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i.imgur.com\/eYIm9DJ.png\" alt=\"test.yaml\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Une fois que nous avons notre fichier qui va servir de base de comparaison, on peut lancer le compare avec notre autre base de donn\u00e9es, et lui demander de g\u00e9n\u00e9rer un fichier de diff\u00e9rence. Je pr\u00e9cise ici qu&#8217;il s&#8217;agit de g\u00e9n\u00e9rer un fichier de modification dans le sens sch\u00e9ma vers l&#8217;extraction. Notre extension g\u00e9n\u00e8rera donc un script pour que notre base corresponde \u00e0 notre fichier yaml :<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">postgres:\/etc\/Pyrseas\/pyrseas$ python3 yamltodb.py test2 $HOME\/test.yaml\r\nALTER TABLE public.client\r\nALTER COLUMN phone TYPE character varying(20);<\/pre>\n<p>&nbsp;<\/p>\n<p>Les ordres SQL sont g\u00e9n\u00e9r\u00e9s en brut dans la r\u00e9ponse de la commande, on peut si on veut les envoyer dans un fichier SQL ce qui nous permet de les relire, puis de les ex\u00e9cuter sur notre base de donn\u00e9es quand on est s\u00fbr qu&#8217;ils font bien ce que l&#8217;on d\u00e9sire.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">postgres@ip-172-44-2-57:\/etc\/Pyrseas\/pyrseas$ python3 yamltodb.py test2 $HOME\/test.yaml &amp;gt; $HOME\/update.sql\r\npostgres:\/etc\/Pyrseas\/pyrseas$ cd $HOME\r\npostgres:~$ vi update.sql <\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">ALTER TABLE public.client\r\nALTER COLUMN phone TYPE character varying(20);\r\n&quot;update.sql&quot; 3L, 78B<\/pre>\n<p>&nbsp;<\/p>\n<p>Pyrseas vient aussi avec une autre option, l&#8217;augmenter de base de donn\u00e9es. Cette option sert \u00e0 am\u00e9liorer facilement votre base de donn\u00e9es \u00e0 l&#8217;aide d&#8217;une liste d&#8217;augmentation pr\u00e9d\u00e9finie. Elles servent globalement \u00e0 gagner du temps puisqu&#8217;elles mettent en place des m\u00e9canismes comme l&#8217;inscription automatique de date de mise \u00e0 jour dans une colonne sans que vous n&#8217;ayez besoin d&#8217;\u00e9crire les triggers.<\/p>\n<p>&nbsp;<\/p>\n<h3>Conclusion :<\/h3>\n<p>&nbsp;<\/p>\n<p>Il y a beaucoup de situations dans la vie de quelqu&#8217;un qui se sert r\u00e9guli\u00e8rement d&#8217;une base de donn\u00e9es dans laquelle on aimerait avoir un outil comme Pyrseas.<br \/>\nComparer deux bases de donn\u00e9es c&#8217;est fastidieux, encore plus quand ce sont des bases de donn\u00e9es volumineuses avec de nombreux objets diff\u00e9rents.<br \/>\nLe fait que cela soit vite fait, qu&#8217;il g\u00e9n\u00e8re par lui-m\u00eame un script d&#8217;\u00e9volution qu&#8217;on peut ex\u00e9cuter directement ou v\u00e9rifier avant de le faire fonctionner est une feature pratique pour rattraper un \u00e9cart de dll entre une production et un autre environnement sans avoir besoin de r\u00e9importer une sauvegarde.<br \/>\nAussi pratique soit-il, cependant, il s&#8217;agit d&#8217;un projet r\u00e9alis\u00e9 par des utilisateurs du moteur, et il n&#8217;est pas forc\u00e9ment parfait.<br \/>\nComme la majorit\u00e9 des extensions pour PostgreSQL, il continue cependant \u00e0 \u00eatre maintenu et \u00e0 \u00eatre corrig\u00e9 au fil du temps.<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F9558&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F9558&#038;title=Pyrseas%20et%20Postgresql%20%3A%20Comparer%20facilement%20des%20sch%C3%A9mas%20de%20base%20de%20donn%C3%A9es\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Pyrseas%20et%20Postgresql%20%3A%20Comparer%20facilement%20des%20sch%C3%A9mas%20de%20base%20de%20donn%C3%A9es&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F9558\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>S&#8217;il vous est d\u00e9j\u00e0 arriv\u00e9 par le pass\u00e9 de faire du run avec deux bases diff\u00e9rentes (une de production et une de qualification par exemple) qui ne sont pas mises \u00e0 jour automatiquement par un outil de publication. Comparer deux&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":41,"featured_media":9587,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[266],"tags":[431,432],"class_list":["post-9558","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-postgresql","tag-postgresql","tag-pyrseas"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Pyrseas et Postgresql : Comparer facilement des sch\u00e9mas de base de donn\u00e9es - Capdata TECH BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pyrseas et Postgresql : Comparer facilement des sch\u00e9mas de base de donn\u00e9es - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"S&#8217;il vous est d\u00e9j\u00e0 arriv\u00e9 par le pass\u00e9 de faire du run avec deux bases diff\u00e9rentes (une de production et une de qualification par exemple) qui ne sont pas mises \u00e0 jour automatiquement par un outil de publication. Comparer deux&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-03T16:05:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-01-19T10:28:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2022\/12\/database-schema-1895779_960_720.png\" \/>\n\t<meta property=\"og:image:width\" content=\"824\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Sarah FAVEERE\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sarah FAVEERE\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/\"},\"author\":{\"name\":\"Sarah FAVEERE\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/686f2452f7ec79115d31e41c230a9da2\"},\"headline\":\"Pyrseas et Postgresql : Comparer facilement des sch\u00e9mas de base de donn\u00e9es\",\"datePublished\":\"2023-01-03T16:05:02+00:00\",\"dateModified\":\"2023-01-19T10:28:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/\"},\"wordCount\":1114,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"keywords\":[\"PostgreSQL\",\"Pyrseas\"],\"articleSection\":[\"PostgreSQL\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/\",\"name\":\"Pyrseas et Postgresql : Comparer facilement des sch\u00e9mas de base de donn\u00e9es - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2023-01-03T16:05:02+00:00\",\"dateModified\":\"2023-01-19T10:28:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pyrseas et Postgresql : Comparer facilement des sch\u00e9mas de base de donn\u00e9es\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.capdata.fr\/#website\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"name\":\"Capdata TECH BLOG\",\"description\":\"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting\",\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.capdata.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.capdata.fr\/#organization\",\"name\":\"Capdata TECH BLOG\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"contentUrl\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"width\":800,\"height\":254,\"caption\":\"Capdata TECH BLOG\"},\"image\":{\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/686f2452f7ec79115d31e41c230a9da2\",\"name\":\"Sarah FAVEERE\",\"sameAs\":[\"http:\/\/blog.capdata.fr\"],\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/sfaveere\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Pyrseas et Postgresql : Comparer facilement des sch\u00e9mas de base de donn\u00e9es - Capdata TECH BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/","og_locale":"fr_FR","og_type":"article","og_title":"Pyrseas et Postgresql : Comparer facilement des sch\u00e9mas de base de donn\u00e9es - Capdata TECH BLOG","og_description":"S&#8217;il vous est d\u00e9j\u00e0 arriv\u00e9 par le pass\u00e9 de faire du run avec deux bases diff\u00e9rentes (une de production et une de qualification par exemple) qui ne sont pas mises \u00e0 jour automatiquement par un outil de publication. Comparer deux&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2023-01-03T16:05:02+00:00","article_modified_time":"2023-01-19T10:28:01+00:00","og_image":[{"width":824,"height":720,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2022\/12\/database-schema-1895779_960_720.png","type":"image\/png"}],"author":"Sarah FAVEERE","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Sarah FAVEERE","Dur\u00e9e de lecture estim\u00e9e":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/"},"author":{"name":"Sarah FAVEERE","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/686f2452f7ec79115d31e41c230a9da2"},"headline":"Pyrseas et Postgresql : Comparer facilement des sch\u00e9mas de base de donn\u00e9es","datePublished":"2023-01-03T16:05:02+00:00","dateModified":"2023-01-19T10:28:01+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/"},"wordCount":1114,"commentCount":0,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"keywords":["PostgreSQL","Pyrseas"],"articleSection":["PostgreSQL"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/","url":"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/","name":"Pyrseas et Postgresql : Comparer facilement des sch\u00e9mas de base de donn\u00e9es - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2023-01-03T16:05:02+00:00","dateModified":"2023-01-19T10:28:01+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/pyrseas-et-postgresql-comparer-facilement-des-schema-de-base-de-donnees\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"Pyrseas et Postgresql : Comparer facilement des sch\u00e9mas de base de donn\u00e9es"}]},{"@type":"WebSite","@id":"https:\/\/blog.capdata.fr\/#website","url":"https:\/\/blog.capdata.fr\/","name":"Capdata TECH BLOG","description":"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting","publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.capdata.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/blog.capdata.fr\/#organization","name":"Capdata TECH BLOG","url":"https:\/\/blog.capdata.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/","url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","contentUrl":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","width":800,"height":254,"caption":"Capdata TECH BLOG"},"image":{"@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/"]},{"@type":"Person","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/686f2452f7ec79115d31e41c230a9da2","name":"Sarah FAVEERE","sameAs":["http:\/\/blog.capdata.fr"],"url":"https:\/\/blog.capdata.fr\/index.php\/author\/sfaveere\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/9558","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=9558"}],"version-history":[{"count":23,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/9558\/revisions"}],"predecessor-version":[{"id":9597,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/9558\/revisions\/9597"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/9587"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=9558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=9558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=9558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}