如何将COPY的CSV文件保存到postgresql表

时间:2015-08-11 02:29:15

标签: ruby-on-rails postgresql csv cloud9-ide

我正在尝试复制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

我应该注意到,在这种情况下,我对用户的概念相当困惑/模糊。 .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文件感到困惑,以便它可以COPY与我的postgresql数据库进行交互。

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

1 个答案:

答案 0 :(得分:0)

经过多次反复试验,我设计了一种始终有效的方法。它可能不是最有效或最优雅的,我感谢建议的改进。这适用于Cloud9,但我认为大多数(如果不是全部)都可以普遍应用。我假设您从头开始或能够删除/重建现有的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服务器。对于每个表,将表的所有者更改为ubuntu。*将每个表的所有权限授予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
    

    对每个数据库重复此操作。要查看/验证数据库表的所有者,请使用以下命令。

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

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

  8. 通过从Cloud9菜单中拖放或文件/上传本地文件,将CSV文件保存到/ db文件夹。我认为任何文件夹都可以,但我在这些说明中引用了/ db文件夹。由于我经常重复这个上传/替换数据的过程,我发现总是命名文件&#34; rake.csv&#34;并且每次都替换它以便我不会结束&#34;存储&#34;或依赖/ db中的数据。这只是一个临时位置。**

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

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

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

    如果要检查表中是否有任何数据,请使用以下命令。

    # \d+ table_dining;
    

    或许只看到表中有多少行数据就足够了。

    # SELECT COUNT(*) FROM table_dining;
    
  11. 最后!将CSV数据添加到您的表格中。

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

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

  12. 一旦您填充了生产数据库并希望将其推送到heroku(假设您正在开始&#34;从头开始&#34;并且不需要保留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
    
  13. 我希望这有用!请告诉我您推荐的任何编辑/方法。

    *我怀疑如果database.yml文件的编写方式不同,可以避免这一步骤,但是我太过分/害怕此时进行此更改。我会编辑,如果有人可以证实这一点,或者我最终会尝试。

    **我几乎可以肯定这个步骤可以用更有效的方法取代;建议欢迎。