python connection.execute中的COPY-FROM:将csv转换为postgres-没有错误但也没有数据

永恒1

我正在尝试将数据从csv加载到我的postgres数据库中。我正在使用sqlalchemy(以及连接/原始sql数据方法而不是ORM方法)。但是,我成功创建了具有相应字段的表。使用复制时,什么也不会发生:我没有收到错误,但我的表也为空。

conn = eng.connect()
trans = conn.begin()

try: 
    conn.execute("""CREATE TABLE IF NOT EXISTS table_name(var1 numeric, date date, time time, datetime timestamp primary key,....);""")
    trans.commit()
except:
    trans.rollback()
    raise

try: 
    # File 1 bid
    conn.execute("""COPY table_name FROM '/home/user/csvfile.csv' 
    WITH CSV HEADER DELIMITER as ','""")
    trans.commit()
except:
    trans.rollback()
    raise

Jupyter笔记本没有报告任何错误消息。

我究竟做错了什么?

此外,我不太了解:

file = "/home/user/csvfile.csv"
  conn.execute("""COPY table_name FROM file 
        WITH CSV HEADER DELIMITER as ','""")

在“文件”中产生错误。

IljaEverilä

交易不可重用:

>>> trans = conn.begin()
2018-03-29 09:14:33,001 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
>>> trans.commit()
2018-03-29 09:14:35,449 INFO sqlalchemy.engine.base.Engine COMMIT
>>> trans.commit()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/u/sqlalchemy/lib/sqlalchemy/engine/base.py", line 1642, in commit
    raise exc.InvalidRequestError("This transaction is inactive")
sqlalchemy.exc.InvalidRequestError: This transaction is inactive
>>> trans.rollback()
>>> 

您必须在第一笔交易之后开始新的交易,或在同一笔交易中执行所有操作。

另一方面,这不能解释为什么COPY失败。在先前的显式事务结束之后,连接将退回到自动提交换句话说,如果没有事务在进行中,则引擎或连接将提交。但是这里有个问题:自动提交基于检测数据更改操作,这是通过将给定语句

AUTOCOMMIT_REGEXP = re.compile(
    r'\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER|GRANT|REVOKE|'
    'IMPORT FOREIGN SCHEMA|REFRESH MATERIALIZED VIEW|TRUNCATE)',
    re.I | re.UNICODE)

您可能会注意到,COPY不是该正则表达式的一部分。如前所述,您最好的选择是开始另一个显式事务,或在同一事务中执行两个动作。但是,如果您希望将来与COPY一起使用自动提交,请指示SQLAlchemy应该自动提交:

conn.execute(text("COPY ...").execution_options(autocommit=True))

至于后一种错误,FROM file不是神奇地访问Python变量,而是一种语法错误。将文件名作为参数传递给查询:

copy_stmt = text("COPY table_name FROM :file WITH CSV HEADER")
copy_stmt = copy_stmt.execution_options(autocommit=True)
conn.execute(copy_stmt, {"file": file})

请注意,从文件复制需要某些您可能不应该拥有的特权

仅允许数据库超级用户使用COPY命名文件或命令,因为它允许读取或写入服务器有权访问的任何文件。

解决方案是使用COPY ... FROM STDIN,但要使用该解决方案您必须使用原始DB-API连接

file = "/home/user/csvfile.csv"
stmt = "COPY table_name FROM STDIN CSV HEADER"

raw_conn = eng.raw_connection()

# Uses the actual psycopg2 connection as a context manager
# for transaction handling.
with open(file) as f, \
        raw_conn.connection, \
        raw_conn.cursor() as cur:
    cur.copy_expert(stmt, f)

raw_conn.close()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将Unicode转换为ASCII且Python中没有错误

在提交时将输入保存到.csv-单击“提交”没有任何反应,但也没有错误

没有错误,没有输出,并且没有将数据插入到jsp的数据库中

Python 程序没有给出错误或警告,但也没有出现任何窗口

通过python代码写入后csv中没有数据

Python中的简单TELNET-如果没有数据,循环将暂停

列表中项目的Python索引没有错误?

在Python中尝试直到没有错误

不同的缩进在Python中没有错误

在Python中中断循环而没有错误-Selenium

无法将数据保存在数据存储区中,但没有错误

Python/MySQL,没有错误但没有插入数据

反正有没有将特定的文本数据转换为 csv 格式并在 python 中给出标题名称?

如何使此代码工作以存储在Laravel中。没有错误也没有存储

甚至没有错误,程序也没有在Eclipse中运行

django 中的 Ajax 不起作用,没有错误,也没有任何反应

在 selenium python 中自动搜索过程没有错误但没有输出

php中的isset()函数不起作用,但也没有显示错误

即使我没有收到任何错误,我在 VS Code 中的 Python 代码也没有运行

在 Python 3.x 中显示到两个小数点......但也没有这些小数点,如果适用 - 如何?

Python 中的数据转换。有没有更好的办法?

带有youtubeAPI显示的应用为空白,Logcat中没有任何内容,也没有错误

python找不到文件错误,cmd中没有错误

导入错误:python 用于 3.7 但在 2.7 中没有错误

堆积的条形图未显示,控制台日志中也没有错误

即使在 php.ini 中使用 display_errors = On,PHP 中也没有错误

Java GUI正在启动,但是什么也没有出现,堆栈跟踪中没有错误

从 SQL Server 中的 XML 列中选择字段时,我没有得到结果也没有错误

瓶子在Python3中错误处理JSON数据,但在Python2中没有错误处理