如何保存 CSV 文件以复制到 postgresql table

how to save CSV file for COPY to postgresql table

我正在尝试复制一个 CSV 文件来填充其中一个表格,但一直在努力。我将不胜感激任何提示或帮助理解它应该如何工作。

编辑: 我在 Cloud9 工作 IDE.

我试过将文件放在不同的位置,包括这个应该可以访问的共享文件夹:

thenutritionalgorithm_development=# COPY foods FROM '/Users/Shared/rake.csv';
ERROR:  could not open file "/Users/Shared/rake.csv" for reading: No such file or directory

当我尝试 \COPY 时,错误消息不同:

thenutritionalgorithm_development=# \COPY foods FROM '/Users/Shared/rake.csv';
/Users/Shared/rake.csv: No such file or directory

此数据库中的表均归我当前用户“ubuntu”所有。

              List of relations
 Schema |       Name        | Type  | Owner  
--------+-------------------+-------+--------
 public | foods             | table | ubuntu
 public | lists             | table | ubuntu
 public | quantities        | table | ubuntu
 public | schema_migrations | table | ubuntu

我的 database.yml 文件表明“ubuntu”应该是有权访问这些数据库的用户。

development:
  adapter: postgresql
  encoding: UTF8
  pool: 5
  username: ubuntu
  password: password
  database: thenutritionalgorithm_development

test:
  adapter: postgresql
  encoding: UTF8
  pool: 5
  username: ubuntu
  password: password
  database: thenutritionalgorithm_test

production:
  adapter: postgresql
  encoding: UTF8
  pool: 5
  username: ubuntu
  password: password
  database: thenutritionalgorithm_production

我应该指出,在这种情况下,我对用户的概念相当 confused/fuzzy。 .yml 中的用户名和密码必须是什么特别的东西吗?

我已将所有权限授予用户 ubuntu:

                                    Access privileges
 Schema |       Name        |   Type   |   Access privileges   | Column access privileges 
--------+-------------------+----------+-----------------------+--------------------------
 public | foods             | table    | ubuntu=arwdDxt/ubuntu | 
 public | foods_id_seq      | sequence |                       | 
 public | lists             | table    |                       | 
 public | lists_id_seq      | sequence |                       | 
 public | quantities        | table    |                       | 
 public | quantities_id_seq | sequence |                       | 
 public | schema_migrations | table    |                       | 

我认为也许解决方案是以某种方式将文件保存在数据库集群中,但我不确定在实践中如何做到这一点(如果这对可以完成的事情有意义的话)。我在编写 .yml 文件后使用简单的 bundle exec rake db:create 创建了数据库。

总的来说,我很困惑如何以及在何处保存 .CSV 文件,以便它可以复制与我的 postgresql 数据库交互。

感谢您的任何建议或提示。

经过反复试验,我设计了一种始终有效的方法。它可能不是最有效或最优雅的,我感谢建议的改进。这是针对 Cloud9 的,尽管我认为大多数(如果不是全部)都可以普遍应用。我假设您是从头开始或能够 delete/rebuild 您现有的 PostgreSQL 数据库。

  1. 启动 PostgreSQL 服务器。

    $ sudo service postgresql start
    
  2. 如果您现有的 PostgreSQL 数据库不包含重要数据,请一次删除一个。

    $ sudo sudo -u postgres psql
    # DROP DATABASE "database_one";
    # DROP DATABASE "database_two";
    
  3. 假设您有三个数据库(开发、测试和生产),请像这样编写您的 database.yml 文件。它以这种方式工作的原因与 PostgreSQL comes preinstalled on every Cloud9 workspace.

    的方式有关
    development:
      adapter: postgresql
      encoding: UTF8
      pool: 5
      username: <%= ENV['USERNAME'] %>
      password: <%= ENV['PASSWORD'] %>
      host: <%= ENV['IP'] %>
      database: yourapp_development
    
    test:
      host: <%= ENV['IP'] %>
      adapter: postgresql
      encoding: UTF8
      pool: 5
      username: <%= ENV['USERNAME'] %>
      password: <%= ENV['PASSWORD'] %>
      database: yourapp_test
    
    production:
      host: <%= ENV['IP'] %>
      adapter: postgresql
      encoding: UTF8
      pool: 5
      username: <%= ENV['USERNAME'] %>
      password: <%= ENV['PASSWORD'] %>
      database: yourapp_production`
    
  4. 创建您的开发和测试数据库。

    $ bundle exec rake db:create
    $ bundle exec rake db:migrate
    

    生产数据库的创建需要单独的命令。

    $ RAILS_ENV=production rake db:create
    $ RAILS_ENV=production rake db:migrate
    
  5. 输入 PostgreSQL 服务器。对于每个 table,将 table 的所有者更改为 ubuntu。* 将每个 table 的所有权限授予 ubuntu。

    $ sudo sudo -u postgres psql
    # \c yourapp_development
    # ALTER TABLE table_dining OWNER TO ubuntu;
    # ALTER TABLE table_kitchen OWNER TO ubuntu;
    # ALTER TABLE lists OWNER TO ubuntu;
    # ALTER TABLE schema_migrations OWNER TO ubuntu;
    # GRANT ALL PRIVILEGES ON table_dining TO ubuntu;
    # GRANT ALL PRIVILEGES ON table_kitchen TO ubuntu;
    # \c postgres
    

    对每个数据库重复此操作。要 view/verify 数据库 table 的所有者,请使用以下命令。

    # \c yourapp_development
    # \dt
    
  6. 仅适用于您将使用 CSV 文件填充的 tables: 删除 created_at 和 updated_at 自动创建的列。

    ALTER TABLE table_dining DROP COLUMN created_at RESTRICT, DROP COLUMN updated_at RESTRICT;
    
  7. 构建一个 CSV 文件,其中第 1 行包含属性名称。将第一列命名为 id 并手动添加 id 号。确保 CSV 列(从左到右)的顺序与迁移中属性添加到数据库的顺序相同 table。如果您想更改列的顺序,请编辑或重新创建您的迁移文件并清除并重新创建您的数据库(重复步骤 2 和 4)。

  8. 通过拖放或从 Cloud9 菜单中 File/Upload 本地文件将 CSV 文件保存到 /db 文件夹。我认为任何文件夹都可以,但我在这些说明中指的是 /db 文件夹。由于我经常重复 uploading/replacing 数据的这个过程,我发现每次都将文件命名为 "rake.csv" 并替换它很有用,这样我就不会结束 "storing" 或依赖/db 中的数据。这只是一个临时位置。**

  9. 使用以下命令将新创建的 rake.csv 文件移动到您的 /tmp 文件夹。

    $ scp db/rake.csv //tmp/rake.csv
    
  10. 输入将添加 CSV 数据的 PostgreSQL 服务器和数据库。如果要完全重新创建数据库,请删除数据库的所有内容。

    $ sudo sudo -u postgres psql
    # \c yourapp_development
    # DELETE FROM table_dining;
    

    如果要查看table中是否有数据,使用以下命令。

    # \d+ table_dining;
    

    或者也许只需要查看 table.

    中有多少行数据就足够了
    # SELECT COUNT(*) FROM table_dining;
    
  11. 终于来了!将 CSV 数据添加到您的 table.

    # copy table_dining from '/tmp/rake.csv' with CSV HEADER;
    

    对所有数据库完成此操作后,您可以在 PostgreSQL 或 Cloud9 终端上查看数据。

  12. 填充生产数据库并希望将其推送到 heroku 后(假设您正在启动 "from scratch" 并且不需要保留 heroku 数据),请使用以下命令。

    $ heroku pg:reset DATABASE
    $ heroku pg:push yourapp_production DATABASE_URL
    $ git add -A
    $ git c
    $ git commit -m "message"
    $ git push
    $ heroku pg:push yourapp_production DATABASE_URL
    $ git push heroku
    $ heroku restart
    

希望对您有所帮助!请让我知道您推荐的任何 edits/methods。

*我怀疑如果 database.yml 文件的编写方式不同,则可以避免此步骤,但我 along/afraid 目前无法进行此更改。如果有人可以证实这一点,或者如果我最终尝试了,我会编辑。

**我几乎可以肯定这一步可以用更有效的方法代替;欢迎提出建议。