【问题标题】:How to import data via alembic (from a CSV file)?如何通过 alembic(从 CSV 文件)导入数据?
【发布时间】:2014-07-14 15:47:26
【问题描述】:

我尝试设计一个数据库模式并使用 alembic(如果重要,还可以使用 virtualenv)。我用 testdata 制作了一些 CSV 文件。目前我通过

将它们复制到交互式 postgresql shell 上的数据库中
/copy table_name FROM '~/path/to/file.csv' WITH CSV;

我想自动执行此操作,这样当我通过 alembic 降级和升级时,我不必手动复制每个表。我尝试了以下方法:

upgrade() 方法中我的alembic 版本文件中,在我的表格生成下方,我添加了:

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;" {}

我做错了什么?

我的问题是我尝试运行只能使用 sqlalchemy 命令的 postgresql 命令吗?如果是这样,我将如何通过 sqlalchemy 做到这一点?

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

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

【问题讨论】:

    标签: postgresql csv sqlalchemy alembic


    【解决方案1】:

    Postgres 不会以“你”身份运行,因此主目录会有所不同。在 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,但你说的很有道理。
    • 为什么会出错? sqlalchemy.exc.OperationalError: (psycopg2.errors.UndefinedFile) could not open file
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2016-01-14
    • 1970-01-01
    • 2015-06-30
    • 2014-08-18
    • 1970-01-01
    相关资源
    最近更新 更多