如何使用pyscopg2在PostgreSQL中创建表?

3

我正在运行一个包含postgres服务的Docker Compose应用程序。这是docker-compose.yml的一部分:

version: '3'

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

在运行了docker-compose builddocker-compose up之后,如果我执行docker ps命令,我可以看到容器正在运行:
kurt@kurt-ThinkPad:~$ 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

既然端口5432映射到本地主机,那么我可以在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);")

所有这些命令都可以无错误执行。为了检查结果,我尝试了以下操作(使用 docker ps 返回的容器ID):

kurt@kurt-ThinkPad:~$ docker exec -it 8a7a20686728 bash
root@8a7a20686728:/# 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)

问题在于我看到了之前创建的表mytable,但是没有看到我尝试使用psycopg2创建的表apks。难道我没有正确地创建表格吗?


1
不确定在这种情况下是否有影响,但您是否关闭了游标和连接? - somesingsomsing
1个回答

5

看起来你可能没有启用自动提交,因此你对数据库进行的任何更改都没有被保存。尝试使用conn.autocommit = True启用它,或者在执行命令后使用conn.commit()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接