我正在处理使用Postgresql的复杂Rails应用程序。 从头开始创建种子可能过于复杂(有许多模型和激活步骤只能以非常特定的顺序工作)。
但是我确实需要一些非常准确的种子来开发新功能。 有没有办法将一些数据从生产数据库传输到开发数据库? 我也不想安装宝石,也不想为此修改生产应用程序。
Tonic(免责声明:我在那里工作)有一个开源解决方案,用于对Postgres数据库进行子集化。它在Github上可用,用Python编写。你可以在这里找到它:https://github.com/TonicAI/condenser。
子集是一个难题,因为您必须保持参照完整性。我们的方法是构建数据库的网络图,其中Tables是节点,FK关系是有向边(从父到子)。然后我们通过topological sort对图形进行排序,并开始机会性地删除行。虽然有一些细微差别和一些陷阱。例如,有向图可以包含循环,当发生这种情况时,拓扑排序将失败。还有更多内容,你可以阅读更多关于它here(或只是克隆回购并拥有它)。
有没有办法将一些数据从生产数据库传输到开发数据库?
仅转储特定的表并使用转储的sql文件为您的开发数据库播种:
pg_dump -d production_database -t table_one -t table_two ... > /tmp/dev_dump.sql
但要小心,经常桌上有外键和其他工作人员。