2017-05-31 5 views
2

Je cours une application Docker Compose qui comprend postgres en tant que service. Voici une partie de docker-compose.yml:Comment créer une table dans PostgreSQL en utilisant pyscopg2?

version: '3' 

services: 
    postgres: 
    image: postgres 
    environment: 
     - POSTGRES_PASSWORD=foo 
    ports: 
     - 5432:5432 

Après docker-compose build suivi par docker-compose up je vois le conteneur est en cours d'exécution si je docker ps:

[email protected]:~$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS     NAMES 
8a7a20686728  postgres   "docker-entrypoint..." 28 minutes ago  Up 17 seconds  0.0.0.0:5432->5432/tcp apkapi_postgres_1 

Depuis le port 5432 est mis en correspondance avec le localhost, je me suis dit que je pouvais procédez comme suit (en ipython):

In [1]: import psycopg2 

In [2]: conn = psycopg2.connect(dbname="postgres", user="postgres", password="fo 
    ...: o", host="localhost") 

In [3]: cursor = conn.cursor() 

In [4]: cursor.execute("CREATE TABLE apks (s3_uri text);") 

Toutes ces commandes exécutent sans aucune erreur. Pour vérifier le résultat, j'ai essayé (en utilisant le conteneur ID de docker ps):

[email protected]:~$ docker exec -it 8a7a20686728 bash 
[email protected]:/# psql -U postgres 
psql (9.6.3) 
Type "help" for help. 

postgres=# \l 
           List of databases 
    Name | Owner | Encoding | Collate | Ctype | Access privileges 
-----------+----------+----------+------------+------------+----------------------- 
postgres | postgres | UTF8  | en_US.utf8 | en_US.utf8 | 
template0 | postgres | UTF8  | en_US.utf8 | en_US.utf8 | =c/postgres   + 
      |   |   |   |   | postgres=CTc/postgres 
template1 | postgres | UTF8  | en_US.utf8 | en_US.utf8 | =c/postgres   + 
      |   |   |   |   | postgres=CTc/postgres 
(3 rows) 

postgres=# \c postgres 
You are now connected to database "postgres" as user "postgres". 
postgres=# \dt 
      List of relations 
Schema | Name | Type | Owner 
--------+---------+-------+---------- 
public | mytable | table | postgres 
(1 row) 

Le problème est que je vois une table mytable que j'avais créé avant, mais pas la table apks que j'ai essayé de créer à l'aide psycopg2 . Est-ce que je ne crée pas la table correctement?

+1

Vous ne savez pas si cela compte dans ce scénario, mais fermez-vous le curseur et la connexion? –

Répondre

3

Il semble que vous ne puissiez pas activer la validation automatique afin que les modifications apportées à la base de données ne soient pas enregistrées. Essayez de l'activer en utilisant conn.autocommit = True ou, après la commande d'exécution, conn.commit().