如何在Heroku中将mysql数据导入postgresql?(Django项目)

时间:2017-03-29 06:01:57

标签: mysql django postgresql heroku

最近我需要将 mysql 数据导入 Heroku 中的 postgres 数据库。实际上,它包括几个步骤:

  1. 将mysql数据转换为postgresql
  2. 将postgresql数据导入Heroku
  3. 在参考了很多材料并在github中测试了几个工具之后,我终于成功了。在这里,我想分享一些我的经验和参考资料。

1 个答案:

答案 0 :(得分:1)

首先,我列出了一些将mysql数据库格式转换为postgresql格式的工具。

  1. mysql-postgresql-converter :我终于使用了这个工具并取得了成功。以PostgreSQL兼容格式转储MySQL数据库
  2.   

    mysqldump -u username -p --compatible = postgresql databasename> outputfile.sql

    然后使用转换器将数据传输到*.psql文件。然后将新转储加载到新的PostgreSQL数据库中。

    1. mysql2postgres:这是一个在Heroku开发中心引入的工具。请参阅此处Migrating from MySQL to Postgres on Heroku。它基于Ruby。但是,就我而言,我在完成安装后找到了一些issues并且无法解决它。
    2.   

      您已激活测试单元2.5.5,但您的Gemfile需要测试单元3.2.3。 #95

      1. py-mysql2pgsql:通过编辑*.yml文件进行配置,与上面的mysql2postgres类似。 README文件中有一个很好的参考表叫做数据类型转换图例,它比较了MySQL和PostgreSQL之间的不同数据类型。您可以手动修改数据类型。
      2. ** 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。

        1. 使用pg_dump文件。reference 使用pg:backups restore命令中的原始文件URL:

          $ heroku pg:backups:restore 'https://s3.amazonaws.com/me/items/3H0q/mydb.dump' DATABASE_URL
          
        2. 在这种情况下,您应首先将转储文件上载到具有HTTP可访问URL的某个位置。 Heroku的开发中心recommend using Amazon S3DATABASE_URL表示要还原到的数据库的HEROKU_POSTGRESQL_COLOR_URL。例如,我的数据库url是postgresql-globular-XXXXX。

          1. 使用pg:push pg:push会将数据从本地psql数据库推送到远程Heroku Postgres数据库。该命令如下所示:

            $heroku pg:push mylocaldb DATABASE_URL --app sushi
            
          2. 此命令将获取本地数据库“mylocaldb”并将其推送到应用程序“sushi”上DATABASE_URL的数据库。请注意,在执行pg:push之前,远程数据库必须为空,以防止意外的数据覆盖和丢失。 实际上我使用这个pg:push方法并最终成功。

            有关Heroku Postgres的更多信息,请参阅official document of Heroku

            **其他人:

              Heroku中您的Web应用程序的
            1. Viewing logsheroku logs --tail
            2. Heruno上的
            3. How to deploy Python和Django应用程序?
            4. 如何编写Django Apps的Procfile? Django项目的常见Procfile将如下所示:

              web: gunicorn yourprojectname.wsgi --log-file -
              
            5. 此处Web是单一流程类型。我们需要修改的是yourprojectname.wsgi。只需在前缀中替换您的项目名称。

              1. 如何将Gunicorn添加到您的应用程序中?

                $ pip install gunicorn
                $ pip freeze > requirements.txt
                
              2. 如何在远程Heroku服务器中运行命令行? 您可以在Heroku中执行bash命令。

                $heroku run bash
                Running bash attached to terminal... up, run.1
                ~ $ ls
                
              3. 然后你可以像你当地的bash一样执行lscd这样的命令。

                此外,您可以使用此模式中的命令在远程Heroku中执行manage.pyheroku run python manage.py runserver