【问题标题】:Use python and psycopg2 to execute a sql file that contains a DROP DATABASE statement使用python和psycopg2执行包含DROP DATABASE语句的sql文件
【发布时间】:2016-07-24 19:21:13
【问题描述】:

我正在尝试使用 python 函数来执行 .sql 文件。

sql 文件以DROP DATABASE 语句开头。
.sql 文件的第一行如下所示:

DROP DATABASE IF EXISTS myDB; 
CREATE DATABASE myDB;

.sql 文件的其余部分定义了“myDB”的所有表和视图

Python 代码:

def connect():
    conn = psycopg2.connect(dbname='template1', user='user01')
    conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
    cursor = conn.cursor()

    sqlfile = open('/path/to/myDB-schema.sql', 'r')
    cursor.execute(sqlfile.read())

    db = psycopg2.connect(dbname='myDB', user='user01')
    cursor = db.cursor()
    return db,cursor

当我运行 connect() 函数时,DROP DATABASE 语句出现错误。

错误:

psycopg2.InternalError: DROP DATABASE cannot be executed from a function or multi-command string

我花了很多时间在谷歌上搜索这个错误,但我找不到解决方案。

我还尝试将 AUTOCOMMIT 语句添加到 .sql 文件的顶部,但它没有改变任何内容。

SET AUTOCOMMIT TO ON;

我知道 postgreSQL 不允许您删除当前连接的数据库,但我认为这不是问题所在,因为我通过连接到 template1 数据库开始 connect() 函数,并从该连接创建打开 .sql 文件的游标对象。

有没有其他人遇到过这个错误,有没有办法使用 python 函数来执行 .sql 文件?

【问题讨论】:

  • 您可能想要创建和删除模式,而不是数据库。
  • @GordonLinoff - 我意识到我可以解决这个问题,我需要在 py 代码中创建/删除数据库的原因是因为我正在处理的项目将其设置为要求. py代码运行一个游戏应用,每个新的游戏实例都会生成一个全新的数据库。
  • 。 .在 Postgres 中删除 数据库 有点像删除整个服务器。通常,您会想要删除存储在架构中的一堆相关表、函数等:postgresql.org/docs/9.4/static/sql-createschema.html

标签: python sql postgresql python-2.7 psycopg2


【解决方案1】:

您正在读取整个文件并将整个内容作为一个字符串传递给 PostgreSQL(如错误消息所述,“多命令字符串”。这是您打算做的吗?如果是,那不是去上班了。

试试这个:

cursor.execute(sqlfile.readline())

或者,向psql 支付费用并让它完成工作。

【讨论】:

  • 谢谢,@jjane 我开始认为它会更容易使用:subprocess.call('psql -f mydb.sql', shell=True)
  • 这仅适用于文件中的第一行,之后没有任何效果。
【解决方案2】:

这对我来说适用于每行中包含 SQL 查询的文件:

sql_file = open('file.sql','r')
cursor.execute(sql_file.read())

【讨论】:

    【解决方案3】:

    为了使用 CRON 部署脚本作为使用 .SQL 的 ETL 文件,我们必须扩展调用 SQL 文件本身的方式。

     sql_file = os.path.join(os.path.dirname(__file__), "../sql/ccd_parcels.sql")
     sqlcurr = open(sql_file, mode='r').read()
     curDest.execute(sqlcurr)
     connDest.commit()
    

    这似乎让 CRON 工作感到高兴......

    【讨论】:

      猜你喜欢
      • 2016-09-18
      • 2022-06-14
      • 2018-11-19
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      相关资源
      最近更新 更多