【问题标题】:A script doesn't execute the command in cur.execute()脚本不执行 cur.execute() 中的命令
【发布时间】:2021-03-21 01:48:39
【问题描述】:

我是 PostgreSQL 和 psycopg2 的新手,遇到了一个问题。

import psycopg2


def create_tables(whichone):

     in_str_station = "CREATE TABLE station (id SMALLINT NOT NULL PRIMARY KEY,  name VARCHAR(40) NOT NULL," \
                 " country VARCHAR(3) NOT NULL, latitude VARCHAR(10),  " \
                 "longitude VARCHAR(10),height SMALLINT);"

     in_str_dailyData = "CREATE TABLE daily_data (id BIGSERIAL NOT NULL PRIMARY KEY," \
                   "s_id SMALLINT NOT NULL REFERENCES station(id)," \
                   "d_date DATE NOT NULL, d_mean NUMERIC(6, 1), quality SMALLINT);"

     int_str_monthlyMean = "CREATE TABLE monthly_mean (id BIGSERIAL NOT NULL PRIMARY KEY,"\
                      "s_id SMALLINT NOT NULL REFERENCES station(id),"\
                      "m_date DATE NOT NULL, m_mean NUMERIC(9, 3),"\
                      "var NUMERIC(9, 3), std NUMERIC(9, 3));"

     in_str_yearlymean = "CREATE TABLE yearly_mean (id BIGSERIAL NOT NULL PRIMARY KEY, " \
                    "s_id SMALLINT NOT NULL REFERENCES station(id)," \
                    "y_date DATE NOT NULL, y_mean NUMERIC(9, 3),var NUMERIC(9, 3)," \
                    "std NUMERIC(9, 3), var_m NUMERIC(9, 3), std_m NUMERIC(9, 3));"

     database_list = {'station': in_str_station, 'monthly_mean': int_str_monthlyMean,
                 'daily_data': in_str_dailyData, 'yearly_mean': in_str_yearlymean}

     try:
        conn = psycopg2.connect(
          host="localhost",
          database="climate",
          user="postgres",
          password="1")

       cur = conn.cursor()
       in_str = database_list.get(whichone)
       cur.execute(in_str)
       output_ = cur.fetchall()
       print(output_)
       cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
       print(error)
    finally:
       if conn is not None:
          conn.close()

我运行脚本后,无论选择哪一个in_str_,都不会创建表。我已经检查过了,当我复制我在 cur.execute 中执行的 in_str 的内容并在 PostgreSQL shell 中使用它时,一切正常。

我在哪里犯错了?

【问题讨论】:

  • 这段代码定义 create_tables() 函数,但没有调用它。如果您有其他代码实际调用它,请显示该代码。

标签: python sql postgresql psycopg2


【解决方案1】:

cur.execute() 之后、conn.close() 之前调用conn.commit()。与 psycopg2 的交易are not implicitly committed

如果连接在事务进行时关闭(使用 close() 方法)或销毁(使用 del 或让它超出范围),服务器将丢弃该事务。

【讨论】:

  • 好吧,谢谢它在我在 cur.execute() 之后添加它之后起作用
【解决方案2】:

我不知道您是否只是在这里这样做了,但缩进是错误的。您需要在函数后缩进代码。

def foo(a):
    pass

【讨论】:

  • 哦,对不起,我在粘贴代码时出错了,到处都是缩进
猜你喜欢
  • 2017-01-04
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多