如何保存 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 数据库。
启动 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 服务器。对于每个 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
仅适用于您将使用 CSV 文件填充的 tables: 删除 created_at 和 updated_at 自动创建的列。
ALTER TABLE table_dining DROP COLUMN created_at RESTRICT, DROP COLUMN updated_at RESTRICT;
构建一个 CSV 文件,其中第 1 行包含属性名称。将第一列命名为 id 并手动添加 id 号。确保 CSV 列(从左到右)的顺序与迁移中属性添加到数据库的顺序相同 table。如果您想更改列的顺序,请编辑或重新创建您的迁移文件并清除并重新创建您的数据库(重复步骤 2 和 4)。
通过拖放或从 Cloud9 菜单中 File/Upload 本地文件将 CSV 文件保存到 /db 文件夹。我认为任何文件夹都可以,但我在这些说明中指的是 /db 文件夹。由于我经常重复 uploading/replacing 数据的这个过程,我发现每次都将文件命名为 "rake.csv" 并替换它很有用,这样我就不会结束 "storing" 或依赖/db 中的数据。这只是一个临时位置。**
使用以下命令将新创建的 rake.csv 文件移动到您的 /tmp 文件夹。
$ scp db/rake.csv //tmp/rake.csv
输入将添加 CSV 数据的 PostgreSQL 服务器和数据库。如果要完全重新创建数据库,请删除数据库的所有内容。
$ sudo sudo -u postgres psql
# \c yourapp_development
# DELETE FROM table_dining;
如果要查看table中是否有数据,使用以下命令。
# \d+ table_dining;
或者也许只需要查看 table.
中有多少行数据就足够了
# SELECT COUNT(*) FROM table_dining;
终于来了!将 CSV 数据添加到您的 table.
# copy table_dining from '/tmp/rake.csv' with CSV HEADER;
对所有数据库完成此操作后,您可以在 PostgreSQL 或 Cloud9 终端上查看数据。
填充生产数据库并希望将其推送到 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 目前无法进行此更改。如果有人可以证实这一点,或者如果我最终尝试了,我会编辑。
**我几乎可以肯定这一步可以用更有效的方法代替;欢迎提出建议。
我正在尝试复制一个 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 数据库。
启动 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 服务器。对于每个 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
仅适用于您将使用 CSV 文件填充的 tables: 删除 created_at 和 updated_at 自动创建的列。
ALTER TABLE table_dining DROP COLUMN created_at RESTRICT, DROP COLUMN updated_at RESTRICT;
构建一个 CSV 文件,其中第 1 行包含属性名称。将第一列命名为 id 并手动添加 id 号。确保 CSV 列(从左到右)的顺序与迁移中属性添加到数据库的顺序相同 table。如果您想更改列的顺序,请编辑或重新创建您的迁移文件并清除并重新创建您的数据库(重复步骤 2 和 4)。
通过拖放或从 Cloud9 菜单中 File/Upload 本地文件将 CSV 文件保存到 /db 文件夹。我认为任何文件夹都可以,但我在这些说明中指的是 /db 文件夹。由于我经常重复 uploading/replacing 数据的这个过程,我发现每次都将文件命名为 "rake.csv" 并替换它很有用,这样我就不会结束 "storing" 或依赖/db 中的数据。这只是一个临时位置。**
使用以下命令将新创建的 rake.csv 文件移动到您的 /tmp 文件夹。
$ scp db/rake.csv //tmp/rake.csv
输入将添加 CSV 数据的 PostgreSQL 服务器和数据库。如果要完全重新创建数据库,请删除数据库的所有内容。
$ sudo sudo -u postgres psql # \c yourapp_development # DELETE FROM table_dining;
如果要查看table中是否有数据,使用以下命令。
# \d+ table_dining;
或者也许只需要查看 table.
中有多少行数据就足够了# SELECT COUNT(*) FROM table_dining;
终于来了!将 CSV 数据添加到您的 table.
# copy table_dining from '/tmp/rake.csv' with CSV HEADER;
对所有数据库完成此操作后,您可以在 PostgreSQL 或 Cloud9 终端上查看数据。
填充生产数据库并希望将其推送到 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 目前无法进行此更改。如果有人可以证实这一点,或者如果我最终尝试了,我会编辑。
**我几乎可以肯定这一步可以用更有效的方法代替;欢迎提出建议。