我正在尝试复制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数据库进行交互。
感谢您提出任何建议或提示。
答案 0 :(得分:0)
经过多次反复试验,我设计了一种始终有效的方法。它可能不是最有效或最优雅的,我感谢建议的改进。这适用于Cloud9,但我认为大多数(如果不是全部)都可以普遍应用。我假设您从头开始或能够删除/重建现有的PostgreSQL数据库。
启动PostgreSQL服务器。
$ sudo service postgresql start
如果您现有的PostgreSQL数据库不包含重要数据,请一次删除一个。
$ sudo sudo -u postgres psql
# DROP DATABASE "database_one";
# DROP DATABASE "database_two";
假设您有三个数据库(开发,测试和生产),请像这样编写您的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`
创建开发和测试数据库。
$ bundle exec rake db:create
$ bundle exec rake db:migrate
创建生产数据库需要单独的命令。
$ RAILS_ENV=production rake db:create
$ RAILS_ENV=production rake db:migrate
进入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
仅适用于您将使用CSV文件填充的表格:删除自动创建的created_at和updated_at列。
ALTER TABLE table_dining DROP COLUMN created_at RESTRICT, DROP COLUMN updated_at RESTRICT;
构建一个CSV文件,其中第1行包含属性的名称。命名第一列id并手动添加id号。确保CSV列(从左到右)的顺序与迁移中将属性添加到数据库表的顺序相同。如果要更改列的顺序,请编辑或重新创建迁移文件,并清除并重新创建数据库(重复步骤2和4)。
通过从Cloud9菜单中拖放或文件/上传本地文件,将CSV文件保存到/ db文件夹。我认为任何文件夹都可以,但我在这些说明中引用了/ db文件夹。由于我经常重复这个上传/替换数据的过程,我发现总是命名文件&#34; rake.csv&#34;并且每次都替换它以便我不会结束&#34;存储&#34;或依赖/ db中的数据。这只是一个临时位置。**
使用以下命令将新创建的rake.csv文件移动到/ tmp文件夹。
$ scp db/rake.csv //tmp/rake.csv
输入PostgreSQL服务器和将添加CSV数据的数据库。如果要完全重新创建,请删除数据库的所有内容。
$ sudo sudo -u postgres psql
# \c yourapp_development
# DELETE FROM table_dining;
如果要检查表中是否有任何数据,请使用以下命令。
# \d+ table_dining;
或许只看到表中有多少行数据就足够了。
# SELECT COUNT(*) FROM table_dining;
最后!将CSV数据添加到您的表格中。
# copy table_dining from '/tmp/rake.csv' with CSV HEADER;
在您对所有数据库完成此操作后,您可以在PostgreSQL或Cloud9终端上查看数据。
一旦您填充了生产数据库并希望将其推送到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
我希望这有用!请告诉我您推荐的任何编辑/方法。
*我怀疑如果database.yml文件的编写方式不同,可以避免这一步骤,但是我太过分/害怕此时进行此更改。我会编辑,如果有人可以证实这一点,或者我最终会尝试。
**我几乎可以肯定这个步骤可以用更有效的方法取代;建议欢迎。