解决一些在 Heroku 上使用 PostgreSQL 的疑惑

别跳过这一节,通过这一节,可以学习到一些数据库的配置的知识.

常规操作

通常我们在连接数据库的时候,会在 config/database.php 中使用 env() 函数来获取 .env 文件中的数据库配置信息,下面我把 config/database.php 拿出来并省略一些无关代码,然后写上一些注释,以供参考

<?php

return [
/*下面这一行代码说明你要连接什么数据库,默认是mysql,我们本地环境中的也是mysql,所以这里最终就是mysql.如果
你在heroku上使用,这里就需要改成pgsql,怎么改,教程里也写了,但是有些小伙伴有点懵,我稍后讲解怎么来更简单的操
作,当然简单操作的代价就是牺牲灵活性.*/
    'default' => env('DB_CONNECTION', 'mysql'),

    'connections' => [
    //mysql不需要修改
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
    //下面的连接信息需要修改,我已经改掉了,怎么改,后面说
        'pgsql' => [
            'driver' => 'pgsql',
            'host' => 'ec2-54-243-46-32.compute-1.amazonaws.com',
            'port' => '5432',
            'database' => 'db5pg2ugul7b02',
            'username' => 'zifcipmvodyqle',
            'password' => '8129f821b4729d9b89c4c0b9ca530652b3d768e881c8df6d23cad66b1e464437',
            'charset' => 'utf8',
            'prefix' => '',
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],
.
.
.

如何获取heroku上的数据库连接信息

方式一

方式一就是教程里写的方式,通过 $url = parse_url(getenv("DATABASE_URL")) 这一行代码来获取,这里的几个返回值我说明一下:

  • DATABASE_URL 这是在你heroku上创建了 Postgres 数据库之后 heroku给你提供的一个URL,里面包含了数据库的连接信息,如何查看这个URL呢?使用 heroku config 这个命令,看图file它给我们显示了包括第2.4节设置的 APP_KEY 变量在内的环境变量.所以我们可以在项目中使用 getenv("DATABASE_URL") 来获取,获取到之后,接下来需要解析这一段URL .
  • parse_url(getenv("DATABASE_URL")) 这里的 parse_url() 函数将该URL解析出来,并返回一个数组,数组内容如下file进一步说就是我们得到了一个关于Postgres 数据库的连接信息,接下来我用Navicat,填入相关信息,连接一下(没啥用,就是进去看看)filefile
    会看到属于我们的数据库已经创建成功了,这里面有很多别人的数据库,我们没权限访问.

既然得到了数据库信息,就可以像教程里一样来操作了.下面我写写我的方式,比较 简单暴力

方式二

使用heroku提供的命令 heroku pg:credentials:url DATABASE 来获取,看图file显示出了数据库信息,既然我们得到了数据库连接信息,就可以自行更改 config/database.php 文件了(真实项目不推荐这样做),下面我把更改后的文件去掉无关内容,贴出来,写一些注释

<?php

return [
/*下面这一行代码,我判断 IS_IN_HEROKU 为真,就设置pgsql,不然就获取 `.env` 文件中的,在heroku
中,IS_IN_HEROKU=true(上文图中有显示),所以在heroku中,这里变成了pgsql,然后就会读取pgsql的配置,往下看*/
    'default' => getenv('IS_IN_HEROKU') ? 'pgsql' : env('DB_CONNECTION', 'mysql'),

    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

        //下面我直接把数据库信息写死在这里,但是失去了灵活性
        'pgsql' => [
            'driver' => 'pgsql',
            'host' => 'ec2-54-243-46-32.compute-1.amazonaws.com', // <---这里
            'port' => '5432',  // <---这里
            'database' => 'db5pg2ugul7b02',  // <---这里
            'username' => 'zifcipmvodyqle',  // <---这里
            'password' => '8129f821b4729d9b89c4c0b9ca530652b3d768e881c8df6d23cad66b1e464437',  // <---这里
            'charset' => 'utf8',
            'prefix' => '',
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],

然后推送并执行迁移

$ git push heroku master
$ heroku run php artisan migrate

注册一个用户,正常
file

本帖已被设为精华帖!
本帖由系统于 4年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 4
StuChoChik

请问 ping 加上Heroku给出的Host显示请求超时怎么办

5年前 评论

@StuChoChik 应该是被墙了,试试开 VPN

5年前 评论

@青风百里 用了也还是不可以,确认邮件收不到。

4年前 评论

file
我做到这里时会报这个问题,更改了database.php中Mysql的编码为utf8之后解决

4年前 评论
127766 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!