我尝试设计数据库模式并使用alembic(如果重要的话,还有virtualenv)。我用testdata制作了一些CSV文件。目前我通过
将它们复制到交互式postgresql shell上的db中/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;" {}
我做错了什么?
我的问题是我尝试运行postgresql命令,我只能使用sqlalchemy命令吗?如果是这样,我将如何通过sqlalchemy做到这一点?
我知道alembic中的批量导入选项,但我宁愿不重新格式化所有内容。
还有其他选项可以自动执行复制操作吗?是否有更好的工作流程?
答案 0 :(得分:0)
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)