数据库入门

您所在的位置:网站首页 php新版本特性 数据库入门

数据库入门

2024-01-23 23:15| 来源: 网络整理| 查看: 265

数据库入门 由 学院君 创建于3年前, 最后更新于 3年前    版本号 #4    20151 views    0 likes    0 collects 简介

Laravel 让连接不同数据库以及对数据库进行增删改查操作变得非常简单,不论使用原生 SQL、还是查询构建器,还是 Eloquent ORM。目前,Laravel 支持四种类型的数据库系统:

MySQL 5.6+ Postgres 9.4+ SQLite 3.8.8+ SQL Server 2017+ 配置

应用的数据库配置位于 config/database.php(但是数据库用户及密码等敏感信息位于 .env 文件,如果你还不知道 .env 是何方神圣,那么你可能需要到这里补补课:https://laravelacademy.org/post/21959#toc-9)。在该文件中你可以定义所有的数据库连接,并指定哪个连接是默认连接。该文件中提供了所有支持数据库系统的配置示例。

默认情况下,Laravel 使用 MySQL 作为数据库引擎,并且示例配置已经为 Laravel Homestead 环境做好了设置,当然,你也可以按照需要为本地的数据库修改该配置(在 .env 中修改数据库配置)。

SQLite 配置

在项目根目录下使用 touch database/database.sqlite 命令创建好新的 SQLite 数据库之后,就可以使用数据库绝对路径配置环境变量指向这个新创建的数据库:

DB_CONNECTION=sqlite DB_DATABASE=/absolute/path/to/database.sqlite

要启用 SQLite 连接的外键约束,需要设置 DB_FOREIGN_KEYS 环境变量值为 true:

DB_FOREIGN_KEYS=true

注:正如其名字所标识的,SQLite 是一个轻量级的、遵守 ACID 标准的关系型数据库,它包含在一个相对小的 C 程序库中。与许多其它数据库管理系统不同,SQLite 不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中。作为嵌入式数据库,是应用程序(如网页浏览器)在本地/客户端存储数据的常见选择。更多关于 SQLite 的信息请查看其官网:http://www.sqlite.org/index.html

使用 URL 进行配置

通常,数据库连接都是使用多个配置值来完成配置,比如 host、database、username、password 等等,每个配置值在 .env 中都有对应的环境变量。这意味着当我们在生产服务器配置数据库连接信息时,需要管理多个环境变量。

有些数据库管理服务提供商如 Heroku 会提供包含所有数据库连接信息的单个「URL」字符串,比如下面这样:

mysql://root:[email protected]/forge?

这些 URL 通常遵循如下标准格式:

driver://username:password@host:port/database?options

为了方便,Laravel 也提供了对这种以 URL 作为数据库连接配置信息的支持。如果 url(对应的环境变量是 DATABASE_URL) 配置项存在,则会被用于解析数据库连接和认证信息。

读写分离

有时候你希望使用一个数据库连接做查询,另一个数据库连接做插入、更新和删除,Laravel 中实现这种读写分离非常简单,不管你用的是原生 SQL,还是查询构建器,还是 Eloquent ORM,只要配置正确,合适的连接总是会被使用。

想要知道如何配置读/写连接,可以参考下面这个例子:

'mysql' => [ 'read' => [ 'host' => [ '192.168.1.1', ], ], 'write' => [ 'host' => [ '196.168.1.3', ], ], 'sticky' => true, 'driver' => 'mysql', 'database' => 'database', 'username' => 'root', 'password' => '', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', ],

注意我们在配置数组中新增了三个键:read、write 和 sticky,read 和 write 这两个键对应值都有一个包含单个键“host”的数组,而其所映射的 IP 值分别就是读连接和写连接,读/写连接的其它数据库配置项都共用 mysql 的主数组配置。

如果我们想要覆盖主数组中的配置,只需要将相应配置项放到 read 和 write 数组中即可。在本例中,192.168.1.1 将被用作「读」连接,而 192.168.1.2 将被用作「写」连接。两个数据库连接的凭证(用户名/密码)、前缀、字符集以及其它配置将会共享 mysql 数组中的设置,同理,如果不一样的话,分别在 read 或 write 数组中单独配置即可。

对于大部分应用来说都是读多写少,所以面对这种情况,如何配置多个读连接,一个写连接?可以这么做:

'mysql' => [ 'driver' => 'mysql', 'read' => [ 'host' => [ '192.168.1.1', '192.168.1.2' ] ], 'write' => [ 'host' => '192.168.1.3' ], ... ]

Laravel 在读数据时会从提供的 IP 中随机选一个进行连接。实现原理感兴趣的同学可以查看 Illuminate\Database\Connectors\ConnectionFactory 底层源码。

注:目前读写分离仅支持单个写连接。

sticky 项

sticky 项是一个可选的配置值,可用于在当前请求生命周期内允许立即读取写入数据库的记录。如果 sticky 选项被启用并且一个"写"操作在当前生命周期内发生,则后续所有"读"操作都会使用这个"写"连接(前提是同一个请求生命周期内),这样就可以确保同一个请求生命周期内写入的数据都可以立即被读取到,从而避免主从延迟导致的数据不一致,是否启用这一功能取决于你。

学院君注:当然,这只是一个针对分布式数据库系统中主从数据同步延迟的一个非常初级的解决方案,访问量不高的中小网站可以这么做,大流量高并发网站肯定不能这么干,主从读写分离本来就是为了解决单点性能问题,这样其实是把问题又引回去了,造成所有读写都集中到写数据库,对于高并发频繁写的场景下,后果可能是不堪设想的,但是话说回来,对于并发量不那么高,写操作不那么频繁的中小型站点来说,sticky 这种方式不失为一个初级的解决方案。

使用不同数据库连接

使用多个数据库连接的时候,可以通过 DB 门面上的 connection 方法访问不同连接。传递给 connection 方法的 name 对应配置文件 config/database.php 中设置的某个连接:

$users = DB::connection('read')->select(...);

甚至还可以指定数据库和连接名,使用 :: 分隔:

$users = DB::connection('mysql::read')->select(...);

你还可以使用连接实例上的 getPdo 方法访问底层原生的 PDO 实例:

$pdo = DB::connection('read')->getPdo(); 运行原生 SQL 查询

配置好数据库连接后,就可以使用 DB 门面来运行查询。DB 门面为每种操作提供了相应方法:select, update, insert, delete 和 statement。

运行 Select 查询

运行一个最基本的查询,可以使用 DB 门面的 select 方法:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3