Basic usage - 基本用法

在开始之前,你首先必须创建一个 Sequelize 的实例。 像下面这样:

  1. const sequelize = new Sequelize('database', 'username', 'password', {
  2. dialect: 'mysql'
  3. });

这将会保存要传递的数据库凭据并提供所有进一步的方法。

此外,你还可以指定非默认的主机或端口:

  1. const sequelize = new Sequelize('database', 'username', 'password', {
  2. dialect: 'mysql',
  3. host: "my.server.tld",
  4. port: 9821,
  5. })

如果你没有密码:

  1. const sequelize = new Sequelize({
  2. database: 'db_name',
  3. username: 'username',
  4. password: null,
  5. dialect: 'mysql'
  6. });

你也可以使用连接字符串:

  1. const sequelize = new Sequelize('mysql://user:pass@example.com:9821/db_name', {
  2. // 更多选项请看下一节
  3. })

选项

除了主机和端口,Sequelize 还提供了一大堆选项。它们在这:

  1. const sequelize = new Sequelize('database', 'username', 'password', {
  2. // 数据库的 sql 方言
  3. // 当前已支持: 'mysql', 'sqlite', 'postgres', 'mssql'
  4. dialect: 'mysql',
  5. // 自定义主机; 默认值: localhost
  6. host: 'my.server.tld',
  7. // 自定义端口; 默认值: 依据 dialect 默认
  8. port: 12345,
  9. // 自定义协议,默认值: 'tcp'
  10. // 仅限 postgres, 用于 Heroku
  11. protocol: null,
  12. // 禁用日志; 默认值: console.log
  13. logging: false,
  14. // 你还可以将任何方言选项传递到底层方言库
  15. // - 默认是空
  16. // - 当前支持: 'mysql', 'postgres', 'mssql'
  17. dialectOptions: {
  18. socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock',
  19. supportBigNumbers: true,
  20. bigNumberStrings: true
  21. },
  22. // sqlite 的存储引擎
  23. // - 默认值 ':memory:'
  24. storage: 'path/to/database.sqlite',
  25. // 禁止将未定义的值插入为NULL
  26. // - 默认值: false
  27. omitNull: true,
  28. // 是否使用本地库的标志
  29. // 如果是 'pg' -- 设置为 true 将允许 SSL 支持
  30. // - 默认值: false
  31. native: true,
  32. // 指定在调用 sequelize.define 时使用的选项
  33. // 如下示例:
  34. // define: { timestamps: false }
  35. // 这基本等同于:
  36. // sequelize.define(name, attributes, { timestamps: false })
  37. // 没有必要像这样去定义每个模型的时间戳选项
  38. define: {
  39. underscored: false
  40. freezeTableName: false,
  41. charset: 'utf8',
  42. dialectOptions: {
  43. collate: 'utf8_general_ci'
  44. },
  45. timestamps: true
  46. },
  47. // 类似于同步:你可以定义始终强制同步模型
  48. sync: { force: true },
  49. // 用于数据库连接池的池配置
  50. pool: {
  51. max: 5,
  52. idle: 30000,
  53. acquire: 60000,
  54. },
  55. // 每个事务的隔离级别.
  56. // 默认为 dialect 默认
  57. isolationLevel: Transaction.ISOLATION_LEVELS.REPEATABLE_READ
  58. })

提示: 你可以通过传递一个方法为日志部分设置一个自定义方法。第一个参数是将被记录的字符串 。

读取复制

Sequelize 支持读取复制,即在要执行 SELECT 查询时可以连接到多个服务器。 当你读取复制时,你指定一个或多个服务器作为读取副本,一个服务器充当写入主机,它处理所有写入和更新,并将其传播到副本(请注意,实际的复制进程为 不是 由 Sequelize 处理,而应该在后端数据库中设置)。

  1. const sequelize = new Sequelize('database', null, null, {
  2. dialect: 'mysql',
  3. port: 3306
  4. replication: {
  5. read: [
  6. { host: '8.8.8.8', username: 'read-username', password: 'some-password' },
  7. { host: '9.9.9.9', username: 'another-username', password: null }
  8. ],
  9. write: { host: '1.1.1.1', username: 'write-username', password: 'any-password' }
  10. },
  11. pool: { // 如果要覆盖用于读写池的选项,可以在此处进行
  12. max: 20,
  13. idle: 30000
  14. },
  15. })

如果你有适用于所有副本的常规设置,则不需要为每个实例单独提供它们。在上面的代码中,数据库名称和端口被传播到所有副本。对于用户和密码也是如此, 如果你把它们用于任何一个副本。每个副本都有以下选项:hostportusernamepassworddatabase

Sequelize使用池来管理到副本的连接。内部 Sequelize 将维护用 pool 配置创建的两个池。

如果要修改这些,可以在实例化 Sequelize 时作为选项传递池,如上所示。

每个 writeuseMaster:true 查询将使用写入池。 对于SELECT,将使用读取池。 只读副本使用基本的循环调度进行切换。

方言

随着 Sequelize 1.6.0 的发布,库可以独立于特定的方言。这意味着您必须自己添加相应的连接器库到您的项目。

MySQL

为了使 Sequelize 与 MySQL 完美结合,您需要安装 mysql2@^1.0.0-rc.10 或更高版本。 一旦完成,你可以这样使用它:

  1. const sequelize = new Sequelize('database', 'username', 'password', {
  2. dialect: 'mysql'
  3. })

注意: 您可以通过设置 dialectOptions 参数将选项直接传递给方言库. 查看 Options
获取例子 (目前只支持mysql).

SQLite

对于 SQLite 兼容性,您将需要 sqlite3 @〜3.0.0。 配置 Sequelize 如下所示:

  1. const sequelize = new Sequelize('database', 'username', 'password', {
  2. // 设置成 sqlite
  3. dialect: 'sqlite',
  4. // sqlite 的存储引擎
  5. // - default ':memory:'
  6. storage: 'path/to/database.sqlite'
  7. })

或者您也可以使用连接字符串以及路径:

  1. const sequelize = new Sequelize('sqlite:/home/abs/path/dbname.db')
  2. const sequelize = new Sequelize('sqlite:relativePath/dbname.db')

PostgreSQL

PostgreSQL 的库是 pg@^5.0.0 || ^6.0.0 你只需要定义方言:

  1. const sequelize = new Sequelize('database', 'username', 'password', {
  2. // 定义为 postgres
  3. dialect: 'postgres'
  4. })

MSSQL

MSSQL 的库是 tedious@^1.7.0 你只需要定义方言:

  1. const sequelize = new Sequelize('database', 'username', 'password', {
  2. dialect: 'mssql'
  3. })

执行原始 SQL 查询

由于常常使用简单的方式来执行原始/已经准备好的SQL查询,所以可以使用“sequelize.query”函数。

这是它如何工作的:

  1. // 原始查询的参数
  2. sequelize.query('your query', [, options])
  3. // 简单的例子
  4. sequelize.query("SELECT * FROM myTable").then(myTableRows => {
  5. console.log(myTableRows)
  6. })
  7. // 如果要返回 sequelize 实例,请使用模型选项。
  8. // 这样,你可以轻松地将查询映射到预定义的sequelize模型,例如:
  9. sequelize
  10. .query('SELECT * FROM projects', { model: Projects })
  11. .then(projects => {
  12. // 每个记录现在将映射到项目的模型。
  13. console.log(projects)
  14. })
  15. // 选项是具有以下键的对象:
  16. sequelize
  17. .query('SELECT 1', {
  18. // 用于记录查询的函数(或false)
  19. // 每个发送到服务器的SQL查询都会调用
  20. logging: console.log,
  21. // 如果 plain 是 TRUE ,则 sequelize 将只返回结果集的第一条记录。
  22. // 如果是 FALSE, 则是全部记录。
  23. plain: false,
  24. // 如果你没有查询的模型定义,请将其设置为true。
  25. raw: false,
  26. // 您正在执行的查询类型。 查询类型会影响结果在传回之前的格式。
  27. type: Sequelize.QueryTypes.SELECT
  28. })
  29. // 注意第二个参数为null!
  30. // 即使我们在这里声明一个被调用,raw: true 将取代并返回一个原始对象。
  31. sequelize
  32. .query('SELECT * FROM projects', { raw: true })
  33. .then(projects => {
  34. console.log(projects)
  35. })

查询中的替换可以通过两种不同的方式完成:
使用命名参数(以:开头),或者由未命名的

使用的语法取决于传递给函数的替换选项:

  • 如果一个数组被传递,? 将按照它们在数组中出现的顺序被替换
  • 如果传递一个对象,:key将被该对象的键替换。如果包含在查询中的对象未找到对应的键,则会抛出异常,反之亦然。
  1. sequelize
  2. .query(
  3. 'SELECT * FROM projects WHERE status = ?',
  4. { raw: true, replacements: ['active']
  5. )
  6. .then(projects => {
  7. console.log(projects)
  8. })
  9. sequelize
  10. .query(
  11. 'SELECT * FROM projects WHERE status = :status ',
  12. { raw: true, replacements: { status: 'active' } }
  13. )
  14. .then(projects => {
  15. console.log(projects)
  16. })

注意一点: 如果表的属性名称包含 “ . “,则生成的对象将被嵌套:

  1. sequelize.query('select 1 as `foo.bar.baz`').then(rows => {
  2. console.log(JSON.stringify(rows))
  3. /*
  4. [{
  5. "foo": {
  6. "bar": {
  7. "baz": 1
  8. }
  9. }
  10. }]
  11. */
  12. })