【发布时间】:2017-08-22 11:14:54
【问题描述】:
最近需要将mysql数据导入Heroku中的postgres数据库。实际上它包括几个步骤:
- 将mysql数据转成postgresql
- 将 postgresql 数据导入 Heroku
参考了很多资料,在github上测试了几个工具,终于成功了。在这里我想分享一些我的经验和参考。
【问题讨论】:
标签: mysql django postgresql heroku
最近需要将mysql数据导入Heroku中的postgres数据库。实际上它包括几个步骤:
参考了很多资料,在github上测试了几个工具,终于成功了。在这里我想分享一些我的经验和参考。
【问题讨论】:
标签: mysql django postgresql heroku
首先,我列出了一些将mysql数据库格式转换为postgresql格式的工具。
mysqldump -u 用户名 -p --compatible=postgresql 数据库名> outputfile.sql
然后使用转换器将数据传输到*.psql 文件中。然后将新转储加载到新的 PostgreSQL 数据库中。
您已经激活了 test-unit 2.5.5,但是您的 Gemfile 需要 test-unit 3.2.3。 #95
*.yml 文件进行配置,与上面的 mysql2postgres 类似的过程。 README 文件中有一个很好的参考表,名为数据类型转换图例,它比较了 MySQL 和 PostgreSQL 之间的不同数据类型。您可以手动修改数据类型。 ** This website 列出了一些其他的转换方法。
PostgreSQL中的一些基本操作:
$sudo su - postgres
$createtedb testdb
$psql testdb
=# create user username password ' password ';
-- To change a password:
=# alter role username password ' password ';
=# create database databasename with encoding 'utf8';
如何在 postgres 中列出所有数据库:PostgreSQL - SELECT Database
postgres-# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+-----------------------
postgres | postgres | UTF8 | C | C |
template0 | postgres | UTF8 | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
testdb | postgres | UTF8 | C | C |
(4 rows)
postgres-#
现在输入以下命令连接/选择所需的数据库,这里我们将连接到 testdb 数据库:
postgres=# \c testdb;
psql (9.2.4)
Type "help" for help.
You are now connected to database "testdb" as user "postgres".
testdb=#
创建数据库后,将转换后的表导入 psql。请注意,在导入数据之前应先创建数据库。
$psql -h server -d databasename -U username -f data.sql
(有时应在 psql 之前添加 sudo -u postgres)
如何使用 pg_dump 生成 psql 的转储:creating dump file
$sudo -u postgres pg_dump -Fc --no-acl --no-owner -h localhost -U postgres databasename > mydb.dump
下一步,如何将数据导入 Heroku Postgres? 在前面的步骤之后,您可能已经将数据导入本地 PostgresSQL 或生成 pg_dump 文件。这里将介绍两种将数据传输到远程 Heroku Postgres 的方法。
使用 pg_dump 文件。reference
在pg:backups restore 命令中使用原始文件 URL:
$ heroku pg:backups:restore 'https://s3.amazonaws.com/me/items/3H0q/mydb.dump' DATABASE_URL
在这种情况下,您应该首先将转储文件上传到具有 HTTP 可访问 URL 的位置。 Heroku 的开发中心recommend using Amazon S3。
DATABASE_URL 代表您希望还原到的数据库的 HEROKU_POSTGRESQL_COLOR_URL。比如我的数据库url是postgresql-globular-XXXXX。
使用pg:push
pg:push 会将本地 psql 数据库中的数据推送到远程 Heroku Postgres 数据库中。该命令如下所示:
$heroku pg:push mylocaldb DATABASE_URL --app sushi
此命令将获取本地数据库“mylocaldb”并将其推送到应用程序“sushi”上DATABASE_URL 的数据库。请注意,在执行pg:push 之前,远程数据库必须为空,以防止意外的数据覆盖和丢失。
其实我用了pg:push这个方法,终于成功了。
有关 Heroku Postgres 的更多信息,请访问official document of Heroku。
**其他:
heroku logs --tail 如何编写 Django Apps 的 Procfile? 一个常见的 Django 项目 Procfile 如下所示:
web: gunicorn yourprojectname.wsgi --log-file -
这里的 web 是一个单一的进程类型。我们需要修改的是yourprojectname.wsgi。只需在前缀中替换您的项目名称即可。
如何将 Gunicorn 添加到您的应用程序中?
$ pip install gunicorn
$ pip freeze > requirements.txt
如何在远程 Heroku 服务器上运行命令行?
您可以在 Heroku 中执行bash 命令。
$heroku run bash
Running bash attached to terminal... up, run.1
~ $ ls
然后您可以像在本地 bash 中一样执行一些命令,例如 ls、cd。
另外,您可以使用此模式中的命令在远程 Heroku 中执行manage.py:heroku run python manage.py runserver
【讨论】: