Changeset 3334
- Date:
- 05.10.2008 16:42:25 (2 mois auparavant)
- Fichiers:
-
- xmlfr/remote/pages/actualites/planete/nonXmlfr/en/atom.xml (modifié) (1 diff)
- xmlfr/remote/pages/actualites/planete/nonXmlfr/fr/atom.xml (modifié) (19 diffs)
- xmlfr/remote/pages/actualites/planete/nonXmlfr/tout/atom.xml (modifié) (19 diffs)
- xmlfr/remote/pages/actualites/planete/planete.xml (modifié) (28 diffs)
- xmlfr/remote/pages/actualites/planete/tout/en/atom.xml (modifié) (1 diff)
- xmlfr/remote/pages/actualites/planete/tout/fr/atom.xml (modifié) (23 diffs)
- xmlfr/remote/pages/actualites/planete/tout/tout/atom.xml (modifié) (23 diffs)
- xmlfr/remote/pages/actualites/planete/xmlfr/en/atom.xml (modifié) (1 diff)
- xmlfr/remote/pages/actualites/planete/xmlfr/fr/atom.xml (modifié) (6 diffs)
- xmlfr/remote/pages/actualites/planete/xmlfr/tout/atom.xml (modifié) (6 diffs)
Légende:
- Non modifié
- Ajouté
- Supprimé
- Modifié
- Copié
- Déplacé
xmlfr/remote/pages/actualites/planete/nonXmlfr/en/atom.xml
r3332 r3334 2 2 <feed xmlns="http://www.w3.org/2005/Atom" xmlns:planet="http://planet.intertwingly.net/" xmlns:indexing="urn:atom-extension:indexing" indexing:index="no"><access:restriction xmlns:access="http://www.bloglines.com/about/specs/fac-1.0" relationship="deny"/> 3 3 <title>PlanÚte XMLfr</title> 4 <updated>2008-10-0 4T13:41:26Z</updated>4 <updated>2008-10-05T14:42:15Z</updated> 5 5 <generator uri="http://intertwingly.net/code/venus/">Venus</generator> 6 6 <author> xmlfr/remote/pages/actualites/planete/nonXmlfr/fr/atom.xml
r3332 r3334 2 2 <feed xmlns="http://www.w3.org/2005/Atom" xmlns:planet="http://planet.intertwingly.net/" xmlns:indexing="urn:atom-extension:indexing" indexing:index="no"><access:restriction xmlns:access="http://www.bloglines.com/about/specs/fac-1.0" relationship="deny"/> 3 3 <title>PlanÚte XMLfr</title> 4 <updated>2008-10-0 4T13:41:26Z</updated>4 <updated>2008-10-05T14:42:15Z</updated> 5 5 <generator uri="http://intertwingly.net/code/venus/">Venus</generator> 6 6 <author> … … 38 38 <subtitle xml:lang="fr">Un peu de tout: XML et technologies associées, presse, édition, photos, métadonnées, documentation, taxonomies/folksonomies, systÚmes éditoriaux, philosophie, épistémologie, mathématiques, histoire</subtitle> 39 39 <title xml:lang="fr">Du bruit au signal (et inversement)</title> 40 <updated>2008-10-04T1 1:00:19Z</updated>40 <updated>2008-10-04T17:39:36Z</updated> 41 41 </source> 42 42 </entry> … … 70 70 <subtitle xml:lang="fr">Un peu de tout: XML et technologies associées, presse, édition, photos, métadonnées, documentation, taxonomies/folksonomies, systÚmes éditoriaux, philosophie, épistémologie, mathématiques, histoire</subtitle> 71 71 <title xml:lang="fr">Du bruit au signal (et inversement)</title> 72 <updated>2008-10-04T1 1:00:19Z</updated>72 <updated>2008-10-04T17:39:36Z</updated> 73 73 </source> 74 74 </entry> … … 118 118 <link href="http://www.figoblog.org/rss.xml" rel="self" type="application/rss+xml"/> 119 119 <title>Figoblog - Un blog sur Internet, la bibliothéconomie et la confiture de figues</title> 120 <updated>2008-10-0 4T13:39:47Z</updated>120 <updated>2008-10-05T14:39:53Z</updated> 121 121 </source> 122 122 </entry> … … 158 158 <subtitle xml:lang="fr">DerniÚres mises à jour du site de David Larlet : biologeek.com relatives aux billets et pensées du site</subtitle> 159 159 <title xml:lang="fr">Flux RSS des billets et des pensées du site biologeek.com</title> 160 <updated>2008-10-0 4T13:40:08Z</updated>160 <updated>2008-10-05T14:40:19Z</updated> 161 161 </source> 162 162 </entry> … … 802 802 <link href="http://www.figoblog.org/rss.xml" rel="self" type="application/rss+xml"/> 803 803 <title>Figoblog - Un blog sur Internet, la bibliothéconomie et la confiture de figues</title> 804 <updated>2008-10-0 4T13:39:54Z</updated>804 <updated>2008-10-05T14:40:00Z</updated> 805 805 </source> 806 806 </entry> … … 1088 1088 1089 1089 <entry xml:lang="fr"> 1090 <id>tag:formats-ouverts.org,2008-09-28:/1727</id> 1091 <link href="http://formats-ouverts.org/blog/2008/09/28/1727-un-format-d-ecriture" rel="alternate" type="text/html"/> 1092 <title xml:lang="fr">Un format d'écriture</title> 1093 <summary xml:lang="fr">Un roman d'une phrase épique 1094 1095 1096 La rentrée littéraire 2008 est riche. Signalons un titre, Zone, un roman de Mathias ENARD, paru aux éditions Actes Sud [1]. 1097 1098 1099 S'agit-il de Mathias ENARD ou ÃNARD ? La couverture met l'accent, la quatriÚme de couverture ne le met pas (mais il y est sur le mot...</summary> 1100 <content type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml"><h5>Un roman d'une phrase épique</h5> 1101 1102 1103 <p>La <a href="http://formats-ouverts.org/blog/2008/09/07/1706-livres-de-la-rentree">rentrée</a> littéraire 2008 est riche. Signalons un titre, <em>Zone</em>, un roman de Mathias ENARD, paru aux éditions Actes Sud [1].</p> 1104 1105 1106 <p>S'agit-il de Mathias ENARD ou ÃNARD ? La couverture met l'accent, la quatriÚme de couverture ne le met pas (mais il y est sur le mot <em>Ãditeur</em> de cette même quatriÚme de couverture). Ah <a href="http://formats-ouverts.org/blog/2007/06/29/1248-la-recolte-des-accents-dans-la-revolte-des-accents">ces accents</a>.</p> 1107 1108 1109 <p>On peut aussi signaler que tout le texte est <em>« une immense phrase itérative »</em> : une seule phrase, sans majuscule (sauf aux noms propres), sans point (sauf d'exclamation ou d'interrogation). Un roman salué par la critique, récit incroyable où on se rend compte que les conventions d'écritures permettentdelireplusaisémentlesmots. Code typographique, rÚgles orthographiques et style ont des <a href="http://formats-ouverts.org/blog/2004/07/01/12-un-article-de-loi-definit-ce-que-sont-les-formats-ouverts">formats ouverts</a>.</p> 1110 1111 1112 <h5>Autre article similaire sur <em>Formats-Ouverts.org</em> :</h5> 1113 <ul> 1114 <li><em><a href="http://formats-ouverts.org/blog/2006/11/07/998-un-livre-au-format-particulier">Mémoire de porc-épic d'Alain Mabanckou, prix Renaudot 2006</a></em></li> 1115 </ul> 1116 1117 <h5>Sources et liens :</h5> 1118 1119 <ul> 1120 <li>[1] Fiche du livre <em>Zone</em>, éditions Actes Sud, <a href="http://www.actes-sud.fr/ficheisbn.php?isbn=9782742777051">http://www.actes-sud.fr/ficheisbn.php?isbn=9782742777051</a></li> 1121 </ul> 1122 1123 <h5>Et sur <em>Formats-Ouverts.org</em> à la même date :</h5> 1124 <ul> 1125 <li>Articles de <a href="http://formats-ouverts.org/blog/2007/09/28">2007</a>, de <a href="http://formats-ouverts.org/blog/2006/09/28">2006</a>, de <a href="http://formats-ouverts.org/blog/2005/09/28">2005</a> et de <a href="http://formats-ouverts.org/blog/2004/09/28">2004</a>.</li> 1126 </ul></div> 1127 </content> 1128 <updated>2008-09-28T21:50:02Z</updated> 1129 <category label="Non-électronique" term="Nonelectronique"/> 1130 <author> 1131 <name>Thierry Stoehr</name> 1132 </author> 1133 <source> 1134 <id>tag:formats-ouverts.org,2008:/blog/</id> 1135 <link href="http://formats-ouverts.org/blog/" rel="alternate" type="text/html"/> 1136 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 1137 <title xml:lang="fr">Pour les formats ouverts !</title> 1138 <updated>2008-09-28T21:50:02Z</updated> 1139 </source> 1140 </entry> 1141 1142 <entry xml:lang="fr"> 1090 1143 <id>urn:md5:4bcef968a434cdc425b56c92bcf83571</id> 1091 1144 <link href="http://blog.tuquoque.com/post/2008/09/28/First-Specification-for-Interoperability-and-Preservation-of-Metadata-in-Digital-Photography-annonce-a-la-Photokina" rel="alternate" type="text/html"/> … … 1120 1173 <subtitle xml:lang="fr">Un peu de tout: XML et technologies associées, presse, édition, photos, métadonnées, documentation, taxonomies/folksonomies, systÚmes éditoriaux, philosophie, épistémologie, mathématiques, histoire</subtitle> 1121 1174 <title xml:lang="fr">Du bruit au signal (et inversement)</title> 1122 <updated>2008-10-04T1 1:00:19Z</updated>1175 <updated>2008-10-04T17:39:36Z</updated> 1123 1176 </source> 1124 1177 </entry> … … 1162 1215 <subtitle xml:lang="fr">DerniÚres mises à jour du site de David Larlet : biologeek.com relatives aux billets et pensées du site</subtitle> 1163 1216 <title xml:lang="fr">Flux RSS des billets et des pensées du site biologeek.com</title> 1164 <updated>2008-10-0 4T13:40:02Z</updated>1217 <updated>2008-10-05T14:40:09Z</updated> 1165 1218 </source> 1166 1219 </entry> … … 1243 1296 1244 1297 <entry xml:lang="fr"> 1298 <id>tag:formats-ouverts.org,2008-09-27:/1726</id> 1299 <link href="http://formats-ouverts.org/blog/2008/09/27/1726-une-precision-sur-skype-en-particulier-et-sur-d-autres-en-general" rel="alternate" type="text/html"/> 1300 <title xml:lang="fr">Une précision sur Skype en particulier et sur d'autres en général</title> 1301 <summary xml:lang="fr">L'article sur Skype et ses formats peut sembler un peu trop neutre : certaines sociétés utilisent des formats ouverts, d'autres pas. Un peu court ? Alors précisons les choses : 1302 1303 à propos de Skype en particulier : il ne s'agit pas de protocoles ouverts, mais fermés et qui...</summary> 1304 <content type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml"><p>L'article sur <a href="http://formats-ouverts.org/blog/2008/09/26/1725-skype-5-ans">Skype et ses formats</a> peut sembler un peu trop neutre : certaines sociétés utilisent des <a href="http://formats-ouverts.org/blog/2004/07/01/12-un-article-de-loi-definit-ce-que-sont-les-formats-ouverts">formats ouverts</a>, d'autres pas. Un peu court ? Alors précisons les choses :</p> 1305 <ul> 1306 <li>à propos de Skype <em>en particulier</em> : il ne s'agit <strong>pas</strong> de protocoles ouverts, mais fermés et qui changent réguliÚrement ; signaler l'anniversaire des 5 ans de formats fermés n'est pas avaliser, mais profiter de l'occasion pour souligner la situation ;</li> 1307 </ul> 1308 <ul> 1309 <li>à propos des autres sociétés ou structures du Web (ou des TIC) <em>en général</em> : l'approche basée sur des formats (ou protocoles) fermés est une possibilité, certes ; <strong>mais</strong> elle pose des problÚmes d'<a href="http://formats-ouverts.org/blog/Interoperabilite">interopérabilité</a>, de sécurité, de concurrence, de pérennité, d'<a href="http://formats-ouverts.org/blog/Archivage">archivage</a>, de coût et d'indépendance.</li> 1310 </ul> 1311 1312 <p>Depuis son ouverture en juillet 2004, le titre du site <em>Formats-Ouverts.org</em> est <em>« Pour les formats ouverts ! »</em> car les formats sont capitaux dans <a href="http://formats-ouverts.org/blog/2006/08/12/906-il-voit-des-formats-partout">le monde numérique</a> : s'ils n'étaient que les seuls utilisés ce site n'aurait pas à souligner les dangers des formats fermés. Il faut donc remercier chaleureusement toutes les structures qui proposent ou imposent des formats fermés, <em>« afin de mieux répondre à notre responsabilité citoyenne »</em> (dixit) sans oublier <em>« pour mettre à disposition les derniÚres technologies et les proposer à nos clients »</em> (sic).</p> 1313 1314 1315 <p>Cela permet d'occuper bénévolement le temps dont on dispose... Cela constitue presque un <em>Remerciement</em> <a href="http://formats-ouverts.org/blog/2008/03/26/1544-1500-articles-et-un-nouveau-format-en-vue">de livre...</a></p> 1316 1317 1318 <h5>Et sur <em>Formats-Ouverts.org</em> à la même date :</h5> 1319 <ul> 1320 <li>Articles de <a href="http://formats-ouverts.org/blog/2007/09/27">2007</a>, de <a href="http://formats-ouverts.org/blog/2006/09/27">2006</a>, de <a href="http://formats-ouverts.org/blog/2005/09/27">2005</a> et de <a href="http://formats-ouverts.org/blog/2004/09/27">2004</a>.</li> 1321 </ul></div> 1322 </content> 1323 <updated>2008-09-27T21:50:06Z</updated> 1324 <category label="Général" term="General"/> 1325 <author> 1326 <name>Thierry Stoehr</name> 1327 </author> 1328 <source> 1329 <id>tag:formats-ouverts.org,2008:/blog/</id> 1330 <link href="http://formats-ouverts.org/blog/" rel="alternate" type="text/html"/> 1331 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 1332 <title xml:lang="fr">Pour les formats ouverts !</title> 1333 <updated>2008-09-28T21:50:02Z</updated> 1334 </source> 1335 </entry> 1336 1337 <entry xml:lang="fr"> 1245 1338 <id>http://www.biologeek.com/2008/09/qui-propose-du-django-en-france/</id> 1246 1339 <link href="http://www.biologeek.com/2008/09/qui-propose-du-django-en-france/" rel="alternate" type="text/html"/> … … 1285 1378 <subtitle xml:lang="fr">DerniÚres mises à jour du site de David Larlet : biologeek.com relatives aux billets et pensées du site</subtitle> 1286 1379 <title xml:lang="fr">Flux RSS des billets et des pensées du site biologeek.com</title> 1287 <updated>2008-10-0 4T13:40:21Z</updated>1380 <updated>2008-10-05T14:40:31Z</updated> 1288 1381 </source> 1289 1382 </entry> … … 1475 1568 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 1476 1569 <title xml:lang="fr">Pour les formats ouverts !</title> 1477 <updated>2008-09-2 6T21:50:16Z</updated>1570 <updated>2008-09-28T21:50:02Z</updated> 1478 1571 </source> 1479 1572 </entry> … … 1819 1912 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 1820 1913 <title xml:lang="fr">Pour les formats ouverts !</title> 1821 <updated>2008-09-2 6T21:50:16Z</updated>1914 <updated>2008-09-28T21:50:02Z</updated> 1822 1915 </source> 1823 1916 </entry> … … 1885 1978 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 1886 1979 <title xml:lang="fr">Pour les formats ouverts !</title> 1887 <updated>2008-09-2 6T21:50:16Z</updated>1980 <updated>2008-09-28T21:50:02Z</updated> 1888 1981 </source> 1889 1982 </entry> … … 1942 2035 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 1943 2036 <title xml:lang="fr">Pour les formats ouverts !</title> 1944 <updated>2008-09-2 6T21:50:16Z</updated>2037 <updated>2008-09-28T21:50:02Z</updated> 1945 2038 </source> 1946 2039 </entry> … … 1999 2092 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 2000 2093 <title xml:lang="fr">Pour les formats ouverts !</title> 2001 <updated>2008-09-2 6T21:50:16Z</updated>2094 <updated>2008-09-28T21:50:02Z</updated> 2002 2095 </source> 2003 2096 </entry> … … 2112 2205 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 2113 2206 <title xml:lang="fr">Pour les formats ouverts !</title> 2114 <updated>2008-09-2 6T21:50:16Z</updated>2207 <updated>2008-09-28T21:50:02Z</updated> 2115 2208 </source> 2116 2209 </entry> … … 2206 2299 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 2207 2300 <title xml:lang="fr">Pour les formats ouverts !</title> 2208 <updated>2008-09-2 6T21:50:16Z</updated>2301 <updated>2008-09-28T21:50:02Z</updated> 2209 2302 </source> 2210 2303 </entry> … … 2355 2448 </source> 2356 2449 </entry> 2357 2358 <entry xml:lang="fr">2359 <id>tag:bortzmeyer.org,2006-02:Blog/psycopg2-adaptation</id>2360 <link href="http://www.bortzmeyer.org/psycopg2-adaptation.html" rel="alternate" type="text/html"/>2361 <title xml:lang="fr">Adaptation des types Python à PostgreSQL pour psycopg</title>2362 <summary xml:lang="fr">psycopg (http://initd.org/pub/software/psycopg/) est l'interface avec2363 PostgreSQL la plus répandue chez les2364 programmeurs Python. Parmi toutes ses qualités, psycopg adapte2365 automatiquement les types Python aux types PostgreSQL. Mais cette2366 adaptation ne fonctionne pas toujours toute seule et a parfois besoin2367 d'un coup de main.</summary>2368 <content type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://initd.org/pub/software/psycopg/">psycopg</a> est l'interface avec2369 PostgreSQL la plus répandue chez les2370 programmeurs Python. Parmi toutes ses qualités, psycopg adapte2371 automatiquement les types Python aux types PostgreSQL. Mais cette2372 <em>adaptation</em> ne fonctionne pas toujours toute seule et a parfois besoin2373 d'un coup de main.</p><p>Avec <a href="http://initd.org/pub/software/psycopg/">psycopg</a>, si j'ai créé une table en SQL avec :2374 <pre>2375 CREATE TABLE Foobar (t TEXT, i INTEGER);2376 </pre>2377 je peux écrire dans mon programme Python :2378 <pre>2379 cursor.execute("INSERT INTO Foobar (t, i) VALUES (%s, %s)",2380 ["I like Python", 42])2381 </pre>2382 et psycopg trouve tout seul que "I like Python" est une chaîne de2383 caractÚres alors que 42 est un entier. Il quote2384 (met entre apostrophes)2385 donc le premier et pas le second. PostgreSQL recevra (instruction2386 SQL affichée grâce à <code>log_statement =2387 'all'</code>) :2388 <pre>2389 2008-09-16 13:40:19 CEST STATEMENT: INSERT INTO Foobar (t, i) VALUES ('I like Python', 42)2390 </pre>2391 Cela marche bien dans ce cas car Python connait les types utilisés et2392 peut donc le dire à psycopg2 :2393 <pre>2394 2395 >>> type(42)2396 <type 'int'>2397 >>> type("I like Python")2398 <type 'str'>2399 2400 </pre>2401 </p><p>Mais si on a affaire à des types qui existent dans PostgreSQL et pas2402 dans Python ? Le cas est fréquent car PostgreSQL dispose de <a href="http://www.postgresql.org/docs/8.3/interactive/datatype.html">nombreux2403 types</a> comme par exemple les <a href="http://www.postgresql.org/docs/8.3/interactive/datatype-geometric.html#AEN5480">points</a>, les <a href="http://www.postgresql.org/docs/8.3/interactive/datatype-net-types.html#DATATYPE-INET">adresses IP</a> ou encore les <a href="http://www.postgresql.org/docs/8.3/interactive/datatype-uuid.html">UUID</a>2404 (RFC 4122). Essayons avec les adresses IP. Créons la table  :2405 <pre>2406 CREATE TABLE Foobar (addr INET);2407 </pre>2408 puis remplissons-la :2409 <pre>2410 cursor.execute("INSERT INTO Foobar (addr) VALUES (%s)",2411 ["2001:DB8::CAFE:1"])2412 </pre>2413 Ãa marche, l'adresse IP <code>2001:db8::cafe:1</code> a bien2414 été enregistrée. Python ne connait pas ce type, donc l'a traité comme2415 une chaîne de caractÚres, que PostgreSQL a su analyser.</p><p>Mais si on veut mettre un <a href="http://www.postgresql.org/docs/8.3/interactive/arrays.html">tableau</a> de telles2416 adresses (petit détour par le DNS : il est2417 tout à fait légal, et même fréquent, qu'à un nom de machine donnée2418 correspondent plusieurs adresses2419 IP) ? Là , Python, psycopg et PostgreSQL ne sont pas assez2420 intelligents. On crée la table :2421 <pre>2422 CREATE TABLE Foobar (addr INET[]);2423 </pre>2424 et on tente de la peupler :2425 <pre>2426 2427 >>> cursor.execute("INSERT INTO Foobar (addr) VALUES (%s)", [["2001:DB8::CAFE:1", "192.168.25.34"]])2428 Traceback (most recent call last):2429 File "<stdin>", line 1, in <module>2430 psycopg2.ProgrammingError: column "addr" is of type inet[] but expression is of type text[]2431 LINE 1: INSERT INTO Foobar (addr) VALUES (ARRAY['2001:DB8::CAFE:1', ...2432 ^2433 HINT: You will need to rewrite or cast the expression.2434 2435 </pre>2436 En effet, PostgreSQL aura reçu :2437 <pre>2438 2008-09-16 13:53:01 CEST LOG: statement: INSERT INTO Foobar (addr) VALUES (ARRAY['2001:DB8::CAFE:1', '192.168.25.34'])2439 </pre>2440 alors qu'il aurait fallu envoyer <code>INSERT INTO Foobar (addr) VALUES ('{2001:DB8::CAFE:1, 192.168.25.34}')</code>.2441 (Le problÚme serait le même pour le type UUID.)</p><p>Quelle est la bonne solution ? psycopg pourrait être plus malin et2442 mieux connaître les types de PostgreSQL mais c'est plus compliqué que2443 ça en a l'air. Heureusement, il existe une solution assez2444 simple. Depuis sa version 2, psycopg permet de définir des2445 <em>adaptateurs</em> soi-même, c'est-à -dire le code qui va2446 faire la conversion d'un objet Python, au moment de l'appel Ã2447 PostgreSQL. Cette technique est documentée (sommairement) dans le2448 fichier <code>doc/extensions.rst</code> qui est distribué avec2449 psycopg. (On le trouve aussi sur le Web en <a href="http://www.initd.org/svn/psycopg/psycopg2/trunk/doc/extensions.rst"><code>http://www.initd.org/svn/psycopg/psycopg2/trunk/doc/extensions.rst</code></a> mais,2450 servi avec une mauvaise indication de son type, il est difficile Ã2451 lire.) Voici l'exemple que donne la documentation. Il utilise le type2452 <a href="http://www.postgresql.org/docs/8.3/interactive/datatype-geometric.html#AEN5480">POINT</a> de PostgreSQL, qui représente un point2453 dans un espace cartésien à deux dimensions. On2454 crée la table avec :2455 <pre>2456 CREATE TABLE Atable (apoint POINT);2457 </pre>2458 et on peut la peupler en SQL ainsi :2459 <pre>2460 INSERT INTO Atable (apoint) VALUES ('(1, 3.14159)');2461 </pre>2462 Pour que cela soit fait automatiquement depuis le programme Python2463 utilisant psycopg2, le code est :2464 <pre>2465 from psycopg2.extensions import adapt, register_adapter, AsIs2466 2467 class Point(object):2468 def __init__(self, x=0.0, y=0.0):2469 self.x = x2470 self.y = y2471 2472 def adapt_point(point):2473 return AsIs("'(%s,%s)'" % (adapt(point.x), adapt(point.y)))2474 2475 register_adapter(Point, adapt_point)2476 2477 curs.execute("INSERT INTO atable (apoint) VALUES (%s)",2478 (Point(1.23, 4.56),))2479 </pre>2480 </p><p>Et voici enfin le (tout petit) adaptateur que j'ai écrit pour le2481 type PostgreSQL <a href="http://www.postgresql.org/docs/8.3/interactive/datatype-net-types.html#DATATYPE-INET">INET</a>, qui permet de2482 représenter des adresses IP :2483 <pre>2484 from psycopg2.extensions import adapt, register_adapter, AsIs2485 2486 class Inet(object):2487 """ Classe pour stocker les adresses IP. Pour que psycopg puisse2488 faire correctement la traduction en SQL, il faut que les objets2489 soient typés. Les chaînes de caractÚres ne conviennent donc pas. """2490 2491 def __init__(self, addr):2492 """ Never call it with unchecked data, there is no protection2493 against injection """2494 self.addr = addr2495 2496 def adapt_inet(address):2497 """ Adaptateur du type Python Inet vers le type PostgreSQL du même2498 nom. On utilise un "cast" PostgreSQL, représenté par '::inet' """2499 return AsIs("'%s'::inet" % address.addr)2500 2501 register_adapter(Inet, adapt_inet)2502 </pre>2503 Et on l'utilise ainsi (notez qu'il faut appeler le2504 constructeur <code>Inet()</code> pour2505 « typer » les valeurs) :2506 <pre>2507 cursor.execute("INSERT INTO Foobar (addr) VALUES (%s)",2508 [[Inet("2001:DB8::CAFE:1"), Inet("192.168.25.34")]])2509 </pre>2510 Désormais, cela fonctionne. PostgreSQL reçoit :2511 <pre>2512 2008-09-16 17:43:48 CEST LOG: statement: INSERT INTO Foobar (addr) VALUES (ARRAY['2001:DB8::CAFE:1'::inet, '192.168.25.34'::inet])2513 </pre>et exécute bien la requête.</p><p>Merci à Chris Cogdon et Federico Di Gregorio (l'auteur de psycopg)2514 pour leur aide sur ce sujet.</p></div>2515 </content>2516 <updated>2008-09-16T00:00:00Z</updated>2517 <published>2008-09-16T00:00:00Z</published>2518 <source>2519 <id>tag:bortzmeyer.org,2006-02:Blog/</id>2520 <icon>http://www.bortzmeyer.org/favicon.ico</icon>2521 <author>2522 <name>Stéphane Bortzmeyer</name>2523 <email>stephane+blog@bortzmeyer.org</email>2524 </author>2525 <link href="http://www.bortzmeyer.org/" rel="alternate" type="text/html"/>2526 <link href="http://www.bortzmeyer.org/feed.atom" rel="self" type="application/atom+xml"/>2527 <link href="http://www.gnu.org/copyleft/fdl.html" rel="license" type="text/html"/>2528 <link href="http://www.gnu.org/licenses/fdl.xml" rel="license" type="application/docbook+xml"/>2529 <link href="http://www.gnu.org/licenses/fdl.txt" rel="license" type="text/plain"/>2530 <rights type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">© Stéphane Bortzmeyer, 2005. <a href="http://www.gnu.org/copyleft/fdl.html">GNU Free Documentation License</a> (GFDL).</div>2531 </rights>2532 <title xml:lang="fr">Blog de Stéphane Bortzmeyer</title>2533 <updated>2008-10-02T10:22:00Z</updated>2534 </source>2535 </entry>2536 2450 </feed> xmlfr/remote/pages/actualites/planete/nonXmlfr/tout/atom.xml
r3332 r3334 2 2 <feed xmlns="http://www.w3.org/2005/Atom" xmlns:planet="http://planet.intertwingly.net/" xmlns:indexing="urn:atom-extension:indexing" indexing:index="no"><access:restriction xmlns:access="http://www.bloglines.com/about/specs/fac-1.0" relationship="deny"/> 3 3 <title>PlanÚte XMLfr</title> 4 <updated>2008-10-0 4T13:41:26Z</updated>4 <updated>2008-10-05T14:42:15Z</updated> 5 5 <generator uri="http://intertwingly.net/code/venus/">Venus</generator> 6 6 <author> … … 38 38 <subtitle xml:lang="fr">Un peu de tout: XML et technologies associées, presse, édition, photos, métadonnées, documentation, taxonomies/folksonomies, systÚmes éditoriaux, philosophie, épistémologie, mathématiques, histoire</subtitle> 39 39 <title xml:lang="fr">Du bruit au signal (et inversement)</title> 40 <updated>2008-10-04T1 1:00:19Z</updated>40 <updated>2008-10-04T17:39:36Z</updated> 41 41 </source> 42 42 </entry> … … 70 70 <subtitle xml:lang="fr">Un peu de tout: XML et technologies associées, presse, édition, photos, métadonnées, documentation, taxonomies/folksonomies, systÚmes éditoriaux, philosophie, épistémologie, mathématiques, histoire</subtitle> 71 71 <title xml:lang="fr">Du bruit au signal (et inversement)</title> 72 <updated>2008-10-04T1 1:00:19Z</updated>72 <updated>2008-10-04T17:39:36Z</updated> 73 73 </source> 74 74 </entry> … … 118 118 <link href="http://www.figoblog.org/rss.xml" rel="self" type="application/rss+xml"/> 119 119 <title>Figoblog - Un blog sur Internet, la bibliothéconomie et la confiture de figues</title> 120 <updated>2008-10-0 4T13:39:47Z</updated>120 <updated>2008-10-05T14:39:53Z</updated> 121 121 </source> 122 122 </entry> … … 158 158 <subtitle xml:lang="fr">DerniÚres mises à jour du site de David Larlet : biologeek.com relatives aux billets et pensées du site</subtitle> 159 159 <title xml:lang="fr">Flux RSS des billets et des pensées du site biologeek.com</title> 160 <updated>2008-10-0 4T13:40:08Z</updated>160 <updated>2008-10-05T14:40:19Z</updated> 161 161 </source> 162 162 </entry> … … 802 802 <link href="http://www.figoblog.org/rss.xml" rel="self" type="application/rss+xml"/> 803 803 <title>Figoblog - Un blog sur Internet, la bibliothéconomie et la confiture de figues</title> 804 <updated>2008-10-0 4T13:39:54Z</updated>804 <updated>2008-10-05T14:40:00Z</updated> 805 805 </source> 806 806 </entry> … … 1088 1088 1089 1089 <entry xml:lang="fr"> 1090 <id>tag:formats-ouverts.org,2008-09-28:/1727</id> 1091 <link href="http://formats-ouverts.org/blog/2008/09/28/1727-un-format-d-ecriture" rel="alternate" type="text/html"/> 1092 <title xml:lang="fr">Un format d'écriture</title> 1093 <summary xml:lang="fr">Un roman d'une phrase épique 1094 1095 1096 La rentrée littéraire 2008 est riche. Signalons un titre, Zone, un roman de Mathias ENARD, paru aux éditions Actes Sud [1]. 1097 1098 1099 S'agit-il de Mathias ENARD ou ÃNARD ? La couverture met l'accent, la quatriÚme de couverture ne le met pas (mais il y est sur le mot...</summary> 1100 <content type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml"><h5>Un roman d'une phrase épique</h5> 1101 1102 1103 <p>La <a href="http://formats-ouverts.org/blog/2008/09/07/1706-livres-de-la-rentree">rentrée</a> littéraire 2008 est riche. Signalons un titre, <em>Zone</em>, un roman de Mathias ENARD, paru aux éditions Actes Sud [1].</p> 1104 1105 1106 <p>S'agit-il de Mathias ENARD ou ÃNARD ? La couverture met l'accent, la quatriÚme de couverture ne le met pas (mais il y est sur le mot <em>Ãditeur</em> de cette même quatriÚme de couverture). Ah <a href="http://formats-ouverts.org/blog/2007/06/29/1248-la-recolte-des-accents-dans-la-revolte-des-accents">ces accents</a>.</p> 1107 1108 1109 <p>On peut aussi signaler que tout le texte est <em>« une immense phrase itérative »</em> : une seule phrase, sans majuscule (sauf aux noms propres), sans point (sauf d'exclamation ou d'interrogation). Un roman salué par la critique, récit incroyable où on se rend compte que les conventions d'écritures permettentdelireplusaisémentlesmots. Code typographique, rÚgles orthographiques et style ont des <a href="http://formats-ouverts.org/blog/2004/07/01/12-un-article-de-loi-definit-ce-que-sont-les-formats-ouverts">formats ouverts</a>.</p> 1110 1111 1112 <h5>Autre article similaire sur <em>Formats-Ouverts.org</em> :</h5> 1113 <ul> 1114 <li><em><a href="http://formats-ouverts.org/blog/2006/11/07/998-un-livre-au-format-particulier">Mémoire de porc-épic d'Alain Mabanckou, prix Renaudot 2006</a></em></li> 1115 </ul> 1116 1117 <h5>Sources et liens :</h5> 1118 1119 <ul> 1120 <li>[1] Fiche du livre <em>Zone</em>, éditions Actes Sud, <a href="http://www.actes-sud.fr/ficheisbn.php?isbn=9782742777051">http://www.actes-sud.fr/ficheisbn.php?isbn=9782742777051</a></li> 1121 </ul> 1122 1123 <h5>Et sur <em>Formats-Ouverts.org</em> à la même date :</h5> 1124 <ul> 1125 <li>Articles de <a href="http://formats-ouverts.org/blog/2007/09/28">2007</a>, de <a href="http://formats-ouverts.org/blog/2006/09/28">2006</a>, de <a href="http://formats-ouverts.org/blog/2005/09/28">2005</a> et de <a href="http://formats-ouverts.org/blog/2004/09/28">2004</a>.</li> 1126 </ul></div> 1127 </content> 1128 <updated>2008-09-28T21:50:02Z</updated> 1129 <category label="Non-électronique" term="Nonelectronique"/> 1130 <author> 1131 <name>Thierry Stoehr</name> 1132 </author> 1133 <source> 1134 <id>tag:formats-ouverts.org,2008:/blog/</id> 1135 <link href="http://formats-ouverts.org/blog/" rel="alternate" type="text/html"/> 1136 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 1137 <title xml:lang="fr">Pour les formats ouverts !</title> 1138 <updated>2008-09-28T21:50:02Z</updated> 1139 </source> 1140 </entry> 1141 1142 <entry xml:lang="fr"> 1090 1143 <id>urn:md5:4bcef968a434cdc425b56c92bcf83571</id> 1091 1144 <link href="http://blog.tuquoque.com/post/2008/09/28/First-Specification-for-Interoperability-and-Preservation-of-Metadata-in-Digital-Photography-annonce-a-la-Photokina" rel="alternate" type="text/html"/> … … 1120 1173 <subtitle xml:lang="fr">Un peu de tout: XML et technologies associées, presse, édition, photos, métadonnées, documentation, taxonomies/folksonomies, systÚmes éditoriaux, philosophie, épistémologie, mathématiques, histoire</subtitle> 1121 1174 <title xml:lang="fr">Du bruit au signal (et inversement)</title> 1122 <updated>2008-10-04T1 1:00:19Z</updated>1175 <updated>2008-10-04T17:39:36Z</updated> 1123 1176 </source> 1124 1177 </entry> … … 1162 1215 <subtitle xml:lang="fr">DerniÚres mises à jour du site de David Larlet : biologeek.com relatives aux billets et pensées du site</subtitle> 1163 1216 <title xml:lang="fr">Flux RSS des billets et des pensées du site biologeek.com</title> 1164 <updated>2008-10-0 4T13:40:02Z</updated>1217 <updated>2008-10-05T14:40:09Z</updated> 1165 1218 </source> 1166 1219 </entry> … … 1243 1296 1244 1297 <entry xml:lang="fr"> 1298 <id>tag:formats-ouverts.org,2008-09-27:/1726</id> 1299 <link href="http://formats-ouverts.org/blog/2008/09/27/1726-une-precision-sur-skype-en-particulier-et-sur-d-autres-en-general" rel="alternate" type="text/html"/> 1300 <title xml:lang="fr">Une précision sur Skype en particulier et sur d'autres en général</title> 1301 <summary xml:lang="fr">L'article sur Skype et ses formats peut sembler un peu trop neutre : certaines sociétés utilisent des formats ouverts, d'autres pas. Un peu court ? Alors précisons les choses : 1302 1303 à propos de Skype en particulier : il ne s'agit pas de protocoles ouverts, mais fermés et qui...</summary> 1304 <content type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml"><p>L'article sur <a href="http://formats-ouverts.org/blog/2008/09/26/1725-skype-5-ans">Skype et ses formats</a> peut sembler un peu trop neutre : certaines sociétés utilisent des <a href="http://formats-ouverts.org/blog/2004/07/01/12-un-article-de-loi-definit-ce-que-sont-les-formats-ouverts">formats ouverts</a>, d'autres pas. Un peu court ? Alors précisons les choses :</p> 1305 <ul> 1306 <li>à propos de Skype <em>en particulier</em> : il ne s'agit <strong>pas</strong> de protocoles ouverts, mais fermés et qui changent réguliÚrement ; signaler l'anniversaire des 5 ans de formats fermés n'est pas avaliser, mais profiter de l'occasion pour souligner la situation ;</li> 1307 </ul> 1308 <ul> 1309 <li>à propos des autres sociétés ou structures du Web (ou des TIC) <em>en général</em> : l'approche basée sur des formats (ou protocoles) fermés est une possibilité, certes ; <strong>mais</strong> elle pose des problÚmes d'<a href="http://formats-ouverts.org/blog/Interoperabilite">interopérabilité</a>, de sécurité, de concurrence, de pérennité, d'<a href="http://formats-ouverts.org/blog/Archivage">archivage</a>, de coût et d'indépendance.</li> 1310 </ul> 1311 1312 <p>Depuis son ouverture en juillet 2004, le titre du site <em>Formats-Ouverts.org</em> est <em>« Pour les formats ouverts ! »</em> car les formats sont capitaux dans <a href="http://formats-ouverts.org/blog/2006/08/12/906-il-voit-des-formats-partout">le monde numérique</a> : s'ils n'étaient que les seuls utilisés ce site n'aurait pas à souligner les dangers des formats fermés. Il faut donc remercier chaleureusement toutes les structures qui proposent ou imposent des formats fermés, <em>« afin de mieux répondre à notre responsabilité citoyenne »</em> (dixit) sans oublier <em>« pour mettre à disposition les derniÚres technologies et les proposer à nos clients »</em> (sic).</p> 1313 1314 1315 <p>Cela permet d'occuper bénévolement le temps dont on dispose... Cela constitue presque un <em>Remerciement</em> <a href="http://formats-ouverts.org/blog/2008/03/26/1544-1500-articles-et-un-nouveau-format-en-vue">de livre...</a></p> 1316 1317 1318 <h5>Et sur <em>Formats-Ouverts.org</em> à la même date :</h5> 1319 <ul> 1320 <li>Articles de <a href="http://formats-ouverts.org/blog/2007/09/27">2007</a>, de <a href="http://formats-ouverts.org/blog/2006/09/27">2006</a>, de <a href="http://formats-ouverts.org/blog/2005/09/27">2005</a> et de <a href="http://formats-ouverts.org/blog/2004/09/27">2004</a>.</li> 1321 </ul></div> 1322 </content> 1323 <updated>2008-09-27T21:50:06Z</updated> 1324 <category label="Général" term="General"/> 1325 <author> 1326 <name>Thierry Stoehr</name> 1327 </author> 1328 <source> 1329 <id>tag:formats-ouverts.org,2008:/blog/</id> 1330 <link href="http://formats-ouverts.org/blog/" rel="alternate" type="text/html"/> 1331 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 1332 <title xml:lang="fr">Pour les formats ouverts !</title> 1333 <updated>2008-09-28T21:50:02Z</updated> 1334 </source> 1335 </entry> 1336 1337 <entry xml:lang="fr"> 1245 1338 <id>http://www.biologeek.com/2008/09/qui-propose-du-django-en-france/</id> 1246 1339 <link href="http://www.biologeek.com/2008/09/qui-propose-du-django-en-france/" rel="alternate" type="text/html"/> … … 1285 1378 <subtitle xml:lang="fr">DerniÚres mises à jour du site de David Larlet : biologeek.com relatives aux billets et pensées du site</subtitle> 1286 1379 <title xml:lang="fr">Flux RSS des billets et des pensées du site biologeek.com</title> 1287 <updated>2008-10-0 4T13:40:21Z</updated>1380 <updated>2008-10-05T14:40:31Z</updated> 1288 1381 </source> 1289 1382 </entry> … … 1475 1568 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 1476 1569 <title xml:lang="fr">Pour les formats ouverts !</title> 1477 <updated>2008-09-2 6T21:50:16Z</updated>1570 <updated>2008-09-28T21:50:02Z</updated> 1478 1571 </source> 1479 1572 </entry> … … 1819 1912 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 1820 1913 <title xml:lang="fr">Pour les formats ouverts !</title> 1821 <updated>2008-09-2 6T21:50:16Z</updated>1914 <updated>2008-09-28T21:50:02Z</updated> 1822 1915 </source> 1823 1916 </entry> … … 1885 1978 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 1886 1979 <title xml:lang="fr">Pour les formats ouverts !</title> 1887 <updated>2008-09-2 6T21:50:16Z</updated>1980 <updated>2008-09-28T21:50:02Z</updated> 1888 1981 </source> 1889 1982 </entry> … … 1942 2035 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 1943 2036 <title xml:lang="fr">Pour les formats ouverts !</title> 1944 <updated>2008-09-2 6T21:50:16Z</updated>2037 <updated>2008-09-28T21:50:02Z</updated> 1945 2038 </source> 1946 2039 </entry> … … 1999 2092 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 2000 2093 <title xml:lang="fr">Pour les formats ouverts !</title> 2001 <updated>2008-09-2 6T21:50:16Z</updated>2094 <updated>2008-09-28T21:50:02Z</updated> 2002 2095 </source> 2003 2096 </entry> … … 2112 2205 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 2113 2206 <title xml:lang="fr">Pour les formats ouverts !</title> 2114 <updated>2008-09-2 6T21:50:16Z</updated>2207 <updated>2008-09-28T21:50:02Z</updated> 2115 2208 </source> 2116 2209 </entry> … … 2206 2299 <link href="http://formats-ouverts.org/atom.php" rel="self" type="application/atom+xml"/> 2207 2300 <title xml:lang="fr">Pour les formats ouverts !</title> 2208 <updated>2008-09-2 6T21:50:16Z</updated>2301 <updated>2008-09-28T21:50:02Z</updated> 2209 2302 </source> 2210 2303 </entry> … … 2355 2448 </source> 2356 2449 </entry> 2357 2358 <entry xml:lang="fr">2359 <id>tag:bortzmeyer.org,2006-02:Blog/psycopg2-adaptation</id>2360 <link href="http://www.bortzmeyer.org/psycopg2-adaptation.html" rel="alternate" type="text/html"/>2361 <title xml:lang="fr">Adaptation des types Python à PostgreSQL pour psycopg</title>2362 <summary xml:lang="fr">psycopg (http://initd.org/pub/software/psycopg/) est l'interface avec2363 PostgreSQL la plus répandue chez les2364 programmeurs Python. Parmi toutes ses qualités, psycopg adapte2365 automatiquement les types Python aux types PostgreSQL. Mais cette2366 adaptation ne fonctionne pas toujours toute seule et a parfois besoin2367 d'un coup de main.</summary>2368 <content type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://initd.org/pub/software/psycopg/">psycopg</a> est l'interface avec2369 PostgreSQL la plus répandue chez les2370 programmeurs Python. Parmi toutes ses qualités, psycopg adapte2371 automatiquement les types Python aux types PostgreSQL. Mais cette2372 <em>adaptation</em> ne fonctionne pas toujours toute seule et a parfois besoin2373 d'un coup de main.</p><p>Avec <a href="http://initd.org/pub/software/psycopg/">psycopg</a>, si j'ai créé une table en SQL avec :2374 <pre>2375 CREATE TABLE Foobar (t TEXT, i INTEGER);2376 </pre>2377 je peux écrire dans mon programme Python :2378 <pre>2379 cursor.execute("INSERT INTO Foobar (t, i) VALUES (%s, %s)",2380 ["I like Python", 42])2381 </pre>2382 et psycopg trouve tout seul que "I like Python" est une chaîne de2383 caractÚres alors que 42 est un entier. Il quote2384 (met entre apostrophes)2385 donc le premier et pas le second. PostgreSQL recevra (instruction2386 SQL affichée grâce à <code>log_statement =2387 'all'</code>) :2388 <pre>2389 2008-09-16 13:40:19 CEST STATEMENT: INSERT INTO Foobar (t, i) VALUES ('I like Python', 42)2390 </pre>2391 Cela marche bien dans ce cas car Python connait les types utilisés et2392 peut donc le dire à psycopg2 :2393 <pre>2394 2395 >>> type(42)2396 <type 'int'>2397 >>> type("I like Python")2398 <type 'str'>2399 2400 </pre>2401 </p><p>Mais si on a affaire à des types qui existent dans PostgreSQL et pas2402 dans Python ? Le cas est fréquent car PostgreSQL dispose de <a href="http://www.postgresql.org/docs/8.3/interactive/datatype.html">nombreux2403 types</a> comme par exemple les <a href="http://www.postgresql.org/docs/8.3/interactive/datatype-geometric.html#AEN5480">points</a>, les <a href="http://www.postgresql.org/docs/8.3/interactive/datatype-net-types.html#DATATYPE-INET">adresses IP</a> ou encore les <a href="http://www.postgresql.org/docs/8.3/interactive/datatype-uuid.html">UUID</a>2404 (RFC 4122). Essayons avec les adresses IP. Créons la table  :2405 <pre>2406 CREATE TABLE Foobar (addr INET);2407 </pre>2408 puis remplissons-la :2409 <pre>2410 cursor.execute("INSERT INTO Foobar (addr) VALUES (%s)",2411 ["2001:DB8::CAFE:1"])2412 </pre>2413 Ãa marche, l'adresse IP <code>2001:db8::cafe:1</code> a bien2414 été enregistrée. Python ne connait pas ce type, donc l'a traité comme2415 une chaîne de caractÚres, que PostgreSQL a su analyser.</p><p>Mais si on veut mettre un <a href="http://www.postgresql.org/docs/8.3/interactive/arrays.html">tableau</a> de telles2416 adresses (petit détour par le DNS : il est2417 tout à fait légal, et même fréquent, qu'à un nom de machine donnée2418 correspondent plusieurs adresses2419 IP) ? Là , Python, psycopg et PostgreSQL ne sont pas assez2420 intelligents. On crée la table :2421 <pre>2422 CREATE TABLE Foobar (addr INET[]);2423 </pre>2424 et on tente de la peupler :2425 <pre>2426 2427 >>> cursor.execute("INSERT INTO Foobar (addr) VALUES (%s)", [["2001:DB8::CAFE:1", "192.168.25.34"]])2428 Traceback (most recent call last):2429 File "<stdin>", line 1, in <module>2430 psycopg2.ProgrammingError: column "addr" is of type inet[] but expression is of type text[]2431 LINE 1: INSERT INTO Foobar (addr) VALUES (ARRAY['2001:DB8::CAFE:1', ...2432 ^2433 HINT: You will need to rewrite or cast the expression.2434 2435 </pre>2436 En effet, PostgreSQL aura reçu :2437 <pre>2438 2008-09-16 13:53:01 CEST LOG: statement: INSERT INTO Foobar (addr) VALUES (ARRAY['2001:DB8::CAFE:1', '192.168.25.34'])2439 </pre>2440 alors qu'il aurait fallu envoyer <code>INSERT INTO Foobar (addr) VALUES ('{2001:DB8::CAFE:1, 192.168.25.34}')</code>.2441 (Le problÚme serait le même pour le type UUID.)</p><p>Quelle est la bonne solution ? psycopg pourrait être plus malin et2442 mieux connaître les types de PostgreSQL mais c'est plus compliqué que2443 ça en a l'air. Heureusement, il existe une solution assez2444 simple. Depuis sa version 2, psycopg permet de définir des2445 <em>adaptateurs</em> soi-même, c'est-à -dire le code qui va2446 faire la conversion d'un objet Python, au moment de l'appel Ã2447 PostgreSQL. Cette technique est documentée (sommairement) dans le2448 fichier <code>doc/extensions.rst</code> qui est distribué avec2449 psycopg. (On le trouve aussi sur le Web en <a href="http://www.initd.org/svn/psycopg/psycopg2/trunk/doc/extensions.rst"><code>http://www.initd.org/svn/psycopg/psycopg2/trunk/doc/extensions.rst</code></a> mais,2450 servi avec une mauvaise indication de son type, il est difficile Ã2451 lire.) Voici l'exemple que donne la documentation. Il utilise le type2452 <a href="http://www.postgresql.org/docs/8.3/interactive/datatype-geometric.html#AEN5480">POINT</a> de PostgreSQL, qui représente un point2453 dans un espace cartésien à deux dimensions. On2454 crée la table avec :2455 <pre>2456 CREATE TABLE Atable (apoint POINT);2457 </pre>2458 et on peut la peupler en SQL ainsi :2459 <pre>2460 INSERT INTO Atable (apoint) VALUES ('(1, 3.14159)');2461 </pre>2462 Pour que cela soit fait automatiquement depuis le programme Python2463 utilisant psycopg2, le code est :2464 <pre>2465 from psycopg2.extensions import adapt, register_adapter, AsIs2466 2467 class Point(object):2468 def __init__(self, x=0.0, y=0.0):2469 self.x = x2470 self.y = y2471 2472 def adapt_point(point):2473 return AsIs("'(%s,%s)'" % (adapt(point.x), adapt(point.y)))2474 2475 register_adapter(Point, adapt_point)2476 2477 curs.execute("INSERT INTO atable (apoint) VALUES (%s)",2478 (Point(1.23, 4.56),))2479 </pre>2480 </p><p>Et voici enfin le (tout petit) adaptateur que j'ai écrit pour le2481 type PostgreSQL <a href="http://www.postgresql.org/docs/8.3/interactive/datatype-net-types.html#DATATYPE-INET">INET</a>, qui permet de2482 représenter des adresses IP :2483 <pre>2484 from psycopg2.extensions import adapt, register_adapter, AsIs2485 2486 class Inet(object):2487 """ Classe pour stocker les adresses IP. Pour que psycopg puisse2488 faire correctement la traduction en SQL, il faut que les objets2489 soient typés. Les chaînes de caractÚres ne conviennent donc pas. """2490 2491 def __init__(self, addr):2492 """ Never call it with unchecked data, there is no protection2493 against injection """2494 self.addr = addr2495 2496 def adapt_inet(address):2497 """ Adaptateur du type Python Inet vers le type PostgreSQL du même2498 nom. On utilise un "cast" PostgreSQL, représenté par '::inet' """2499 return AsIs("'%s'::inet" % address.addr)2500 2501 register_adapter(Inet, adapt_inet)2502 </pre>2503 Et on l'utilise ainsi (notez qu'il faut appeler le2504 constructeur <code>Inet()</code> pour2505 « typer » les valeurs) :2506 <pre>2507 cursor.execute("INSERT INTO Foobar (addr) VALUES (%s)",2508 [[Inet("2001:DB8::CAFE:1"), Inet("192.168.25.34")]])2509 </pre>2510 Désormais, cela fonctionne. PostgreSQL reçoit :2511 <pre>2512 2008-09-16 17:43:48 CEST LOG: statement: INSERT INTO Foobar (addr) VALUES (ARRAY['2001:DB8::CAFE:1'::inet, '192.168.25.34'::inet])2513 </pre>et exécute bien la requête.</p><p>Merci à Chris Cogdon et Federico Di Gregorio (l'auteur de psycopg)2514 pour leur aide sur ce sujet.</p></div>2515 </content>2516 <updated>2008-09-16T00:00:00Z</updated>2517 <published>2008-09-16T00:00:00Z</published>2518 <source>2519 <id>tag:bortzmeyer.org,2006-02:Blog/</id>2520 <icon>http://www.bortzmeyer.org/favicon.ico</icon>2521 <author>2522 <name>Stéphane Bortzmeyer</name>2523 <email>stephane+blog@bortzmeyer.org</email>2524 </author>2525 <link href="http://www.bortzmeyer.org/" rel="alternate" type="text/html"/>2526 <link href="http://www.bortzmeyer.org/feed.atom" rel="self" type="application/atom+xml"/>2527 <link href="http://www.gnu.org/copyleft/fdl.html" rel="license" type="text/html"/>2528 <link href="http://www.gnu.org/licenses/fdl.xml" rel="license" type="application/docbook+xml"/>2529 <link href="http://www.gnu.org/licenses/fdl.txt" rel="license" type="text/plain"/>2530 <rights type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">© Stéphane Bortzmeyer, 2005. <a href="http://www.gnu.org/copyleft/fdl.html">GNU Free Documentation License</a> (GFDL).</div>2531 </rights>2532 <title xml:lang="fr">Blog de Stéphane Bortzmeyer</title>2533 <updated>2008-10-02T10:22:00Z</updated>2534 </source>2535 </entry>2536 2450 </feed> xmlfr/remote/pages/actualites/planete/planete.xml
r3332 r3334 1 1 <?xml version="1.0"?> 2 <feed xmlns="http://
