赞
踩
企业真实的 Rails 项目,由于业务量大, SQLite 数据库不适合,所以我们需要一个性能和特性都符合企业级别的数据库,通常来说也就两个选择:PostgreSQL 和 MySQL。
不过 Rails 项目更喜欢使用 PostgreSQL,因为它更加稳定,更加安全,更加高效,更加可靠,特性也更加丰富。接下来我们主要学习 PostgreSQL 相关的知识。当你掌握了 PostgreSQL 后,只需要花费很少的时间就能掌握 MySQL。
参考文档
PostgreSQL 是最初的伯克利代码的开源继承者。它支持大部分 SQL 标准并且提供了许多现代特性:
同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的:
并且,因为自由宽松的许可证,任何人都可以以任何目的免费使用、修改和分发 PostgreSQL, 不管是私用、商用还是学术研究目的。
PostgreSQL 是一个免费的对象 - 关系数据库服务器 (ORDBMS),在灵活的 BSD 许可证下发行。相比 SQLite 来说,PostgreSQL 的安装较为繁琐。
PostgreSQL 入门教程: http://www.postgres.cn/docs/13/tutorial-createdb.html
如果是在 Windows 或 macOS 上安装 PostgreSQL,下载对应的安装包即可,下载地址:
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
由于企业主要是在 Linux 系统中安装 PostgreSQL,我们也打算在 Linux 上安装 PostgreSQL。但是对于初学者来时,安装及配置过程比较繁琐。我推荐使用
Docker 容器来安装 PostgreSQL,这样可以让你在 Linux 上安装 PostgreSQL,而不用担心安装及配置的繁琐问题了。
可以参考 https://docs.docker.com/engine/install/ubuntu/ 在 Ubuntu 系统中安装 Docker。
下一讲我们会总结介绍下 Docker。
# 源码
https://gitee.com/rails-train-camp01/db_basic/tree/master/303
比如 /docker_pg
添加 /docker_pg/docker-compose.yml
version: '3.7'
services:
postgres:
image: postgres:13
env_file: .env
ports:
- 5432:5432
volumes:
- ./data:/var/lib/postgresql/data
添加 /docker_pg/.env
POSTGRES_HOST=127.0.0.1
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=test_db
POSTGRES_PORT=5434
启动 Docker 引擎
sudo service docker start
启动 PostgreSQL 服务
docker-compose up
# 或者以后台发服务的方式启动
docker-compose up -d
通过 VS Code 插件查看是否启动成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QikeyNh7-1638975183325)(img/docker_pg.jpg)]
可以使用如下 Ruby 脚本测试下 PostgreSQL 是否能正确连接
可以使用如下命令安装 pg gem。
gem install pg
安装失败可以在学习群里 @我。
require 'pg'
conn = PG.connect(host: '127.0.0.1', user: 'postgres', password: 'postgres', dbname: 'test_db' )
activerecord 是 Rails 内置的 ORM 库,支持常见的数据库,如 MySQL、SQLite、PostgreSQL、Oracle 等。
示例 1: pg_stat_activity
require 'pg'
conn = PG.connect(host: '127.0.0.1', user: 'postgres', password: 'postgres', dbname: 'test_db' )
conn.exec( "SELECT * FROM pg_stat_activity" ) do |result|
puts " PID | User | Query"
result.each do |row|
puts " %7d | %-16s | %s " %
row.values_at('pid', 'usename', 'query')
end
end
示例 2: 创建表
require 'pg'
conn = PG.connect(host: '127.0.0.1', user: 'postgres', password: 'postgres', dbname: 'test_db' )
sql = "create table students ( name varchar(50), email varchar(50), grade varchar(5), blog varchar(50) )"
conn.exec(sql)
示例 3: 插入数据
require 'pg'
conn = PG.connect(host: '127.0.0.1', user: 'postgres', password: 'postgres', dbname: 'test_db' )
sql = "INSERT INTO students (name, email, grade, blog) VALUES ('Jane', 'me@janedoe.com', 'A', 'http://blog.janedoe.com')"
conn.exec(sql)
示例 4: 更新数据
require 'pg'
conn = PG.connect(host: '127.0.0.1', user: 'postgres', password: 'postgres', dbname: 'test_db' )
sql = "INSERT INTO students (name, email, grade, blog) VALUES ('Jane', 'me@janedoe.com', 'A', 'http://blog.janedoe.com')"
conn.exec(sql)
示例 5: 查询数据
require 'pg'
conn = PG.connect(host: '127.0.0.1', user: 'postgres', password: 'postgres', dbname: 'test_db' )
sql = "select * from students"
conn.exec(sql)
示例 6: 删除数据
require 'pg'
conn = PG.connect(host: '127.0.0.1', user: 'postgres', password: 'postgres', dbname: 'test_db' )
sql = "delete from students where name = 'Jane'"
conn.exec(sql)
对象关系映(英语:Object Relational Mapping,简称 ORM,或 O/RM,或 O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的 “虚拟对象数据库”。如今已有很多免费和付费的 ORM 产品,而有些程序员更倾向于创建自己的 ORM 工具。
简单说就是,ORM 就是把数据库的表结构和对象结构进行映射,从而使得程序员可以通过编程语言来操作数据库,而不需要知道数据库的细节。
假如我们有一张学生表,其创建 SQL 如下
create table students (
name varchar(50),
email varchar(50),
grade varchar(5),
blog varchar(50)
);
下面我们使用 ruby 创建一个包含 students 表的 PostgreSQL 数据库。
require 'pg'
conn = PG.connect(host: '127.0.0.1', user: 'postgres', password: 'postgres', dbname: 'test_db' )
sql = "create table students ( id serial NOT NULL, name varchar(50), email varchar(50), grade varchar(5), blog varchar(50) )"
conn.exec(sql)
Ruby 中有很多 ORM 库,比如 ActiveRecord、Sequel。不过 Rails 默认使用的是 ActiveRecord,下面以 ActiveRecord 为例,我们来看看它的使用方法。
首先安装 activerecord。
gem install activerecord
require 'pg' require 'active_record' ActiveRecord::Base.establish_connection( adapter: 'postgresql', host: '127.0.0.1', username: 'postgres', password: 'postgres', database: 'test_db' ) class Student < ActiveRecord::Base end # create Student.create(name: 'peng', email: 'peng@qq.com') # update student = Student.first student.name = 'peng2' student.save # read student = Student.where(name: 'peng2').first p student # delete student = Student.where(name: 'peng2').delete_all p Student.all.count
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。