如何通过Alembic导入数据(从CSV文件)?

6

我正在设计一个数据库架构,并使用alembic(如果有关系的话,还会用到virtualenv)。我创建了一些带有测试数据的CSV文件。目前我通过交互式的postgresql shell将它们复制到数据库中:

/copy table_name FROM '~/path/to/file.csv' WITH CSV;

我希望能自动化这个过程,这样我就不必手动复制每个表格了,当我通过alembic进行降级和升级时。我尝试了以下方法:
在我的alembic版本文件中,在upgrade()方法中,在生成表格的下方添加如下内容:
op.execute("copy table_name FROM '~/path/to/file.csv' WITH CSV;", execution_options=None)

但它从未找到该文件。这是错误信息:
File "/Users/me/Workspace/project/venv/lib/python3.4/site-packages/SQLAlchemy-0.9.4-py3.4-macosx-10.6-intel.egg/sqlalchemy/engine/default.py", line 435, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (OperationalError) could not open file "~/Workspace/project/path/to/file.csv" for reading: No such file or directory
 "copy table_name FROM '~/Workspace/project/path/to/file.csv' WITH CSV;" {}

我做错了什么?

我的问题是我尝试运行postgresql命令,但我只能使用sqlalchemy命令吗?如果是这样,我该如何通过sqlalchemy完成它?

我知道alembic中有批量导入选项,但我不想重新格式化所有内容。

是否有其他选项可以自动执行复制操作?是否有更好的工作流程?

1个回答

1

Postgres不作为"you"运行,因此主目录将不同。在输入postgres中的文件路径时,始终使用完整的文件路径。如果作为alembic升级的一部分执行此操作,则应执行以下操作:

import os
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, 'relative/path/to/file/you/want')
op.execute(f"copy table_name FROM '{file_name}' WITH CSV;", execution_options=None)

太棒了,谢谢!我几年前就停止使用Python了,但你说的很有道理。 - einSelbst
为什么会出现错误?sqlalchemy.exc.OperationalError: (psycopg2.errors.UndefinedFile) could not open file - Saeed Esmaili

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