此系列文章的应用示例已发布于 GitHub: sequelize-docs-Zh-CN. 能够 Fork 帮助改进或 Star 关注更新. 欢迎 Star.mysql
在开始以前,你首先必须建立一个 Sequelize 的实例。 像下面这样:git
const sequelize = new Sequelize('database', 'username'[, 'password'])
这将会保存要传递的数据库凭据并提供全部进一步的方法。此外,你还能够指定非默认的主机或端口:github
const sequelize = new Sequelize('database', 'username', 'password', { host: "my.server.tld", port: 12345 })
若是你没有密码:sql
const sequelize = new Sequelize('database', 'username') // 或 const sequelize = new Sequelize('database', 'username', null)
你也可使用链接字符串:数据库
const sequelize = new Sequelize('mysql://user:pass@example.com:9821/dbname', { // 更多选项请看下一节 })
除了主机和端口,Sequelize 还提供了一大堆选项。它们在这:数组
const sequelize = new Sequelize('database', 'username', 'password', { // 自定义主机; 默认值: localhost host: 'my.server.tld', // 自定义端口; 默认值: 3306 port: 12345, // 自定义协议 // - 默认值: 'tcp' // - 版本: v1.5.0 // - 仅限 postgres, 用于 heroku protocol: null, // 禁用日志; 默认值: console.log logging: false, // 数据库的 sql 方言 // - 当前支持: 'mysql', 'sqlite', 'postgres', 'mssql' dialect: 'mysql', // 你还能够将任何方言选项传递到底层方言库 // - 默认是空 // - 当前支持: 'mysql', 'postgres', 'mssql' dialectOptions: { socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock', supportBigNumbers: true, bigNumberStrings: true }, // sqlite 的存储引擎 // - 默认值 ':memory:' storage: 'path/to/database.sqlite', // 禁止将未定义的值插入为NULL // - 默认值: false omitNull: true, // 是否使用本地库的标志 // 若是是 'pg' -- 设置为 true 将容许 SSL 支持 // - 默认值: false native: true, // 指定在调用 sequelize.define 时使用的选项 // 以下示例: // define: {timestamps: false} // 这基本等同于: // sequelize.define(name, attributes, { timestamps: false }) // 没有必要像这样去设置每一个定义的时间戳选项 // 下面你看到的这些可能设置的键. 本章中都进行了说明 define: { underscored: false freezeTableName: false, syncOnAssociation: true, charset: 'utf8', dialectOptions: { collate: 'utf8_general_ci' }, timestamps: true }, // 相似于同步:你能够定义始终强制同步模型 sync: { force: true }, // 每次关联后进行同步(见下文)。 若是设置为 false,则须要在设置全部关联后手动进行同步。 默认值: true syncOnAssociation: true, // 使用链接池来减小数据库链接超载并提升速度 // 当前仅支持 mysql 和 postgresql (从 v1.5.0 开始) pool: { max: 5, idle: 30}, // 用于肯定如何根据 [lingo project](https://github.com/visionmedia/lingo) 将单词翻译成单数形式或复数形式 // 选项为: en [默认], es language: 'en', // 每一个事务的隔离级别. 默认是 REPEATABLE_READ // 可用选项: // READ_UNCOMMITTED // READ_COMMITTED // REPEATABLE_READ // SERIALIZABLE isolationLevel: Transaction.ISOLATION_LEVELS.REPEATABLE_READ })
提示: 你能够经过传递一个方法为日志部分设置一个自定义方法。第一个参数是将被记录的字符串 。服务器
Sequelize 支持读取复制,即在要执行 SELECT 查询时能够链接到多个服务器。 当你读取复制时,你指定一个或多个服务器做为读取副本,一个服务器充当写入主机,它处理全部写入和更新,并将其传播到副本(请注意,实际的复制进程为 不是 由 Sequelize 处理,而应该在 MySql 中设置)。socket
const sequelize = new Sequelize('database', null, null, { dialect: 'mysql', port: 3306 replication: { read: [ { host: '8.8.8.8', username: 'anotherusernamethanroot', password: 'lolcats!' }, { host: 'localhost', username: 'root', password: null } ], write: { host: 'localhost', username: 'root', password: null } }, pool: { // 若是要覆盖用于读取池的选项,能够在此处进行 max: 20, idle: 30000 }, })
若是你有适用于全部副本的常规设置,则不须要为每一个实例单独提供它们。在上面的代码中,数据库名称和端口被传播到全部副本。对于用户和密码也是如此, 若是你把它们用于任何一个副本。每一个副本都有如下选项:host
,port
,username
,password
,database
。tcp
Sequelize 使用池来管理与副本的链接。 默认选项为:函数
{ max: 5, min: 0, idle: 10000, acquire: 10000, evict: 60000, handleDisconnects: true }
若是要修改这些,能够在实例化 Sequelize 时做为选项传递池,如上所示。
注意: 读复制当前只适用于MySQL!
随着 Sequelize 1.6.0
的发布,库能够独立于特定的方言。这意味着您必须本身添加相应的链接器库到您的项目。版本 1.7.0 stable 已经与链接器库(sequelize-mysql,sequelize-postgres等)捆绑在一块儿发布,可是这些软件包没有被维护,而且不会向2.0.0发布。
为了使 Sequelize 与 MySQL 完美结合,您须要安装 mysql2@^1.0.0-rc.10
或更高版本。 一旦完成,你能够这样使用它:
const sequelize = new Sequelize('database', 'username', 'password', { dialect: 'mysql' })
注意: 您能够经过设置 dialectOptions
参数将选项直接传递给方言库. 查看 Options
获取例子 (目前只支持mysql).
对于 SQLite 兼容性,您将须要 sqlite3 @〜3.0.0
。 配置 Sequelize 以下所示:
const sequelize = new Sequelize('database', 'username', 'password', { // 设置成 sqlite dialect: 'sqlite', // sqlite 的存储引擎 // - default ':memory:' storage: 'path/to/database.sqlite' })
或者您也可使用链接字符串以及路径:
const sequelize = new Sequelize('sqlite:/home/abs/path/dbname.db') const sequelize = new Sequelize('sqlite:relativePath/dbname.db')
PostgreSQL 的库是 pg@^5.0.0 || ^6.0.0 || ^7.0.0
你只须要定义方言:
const sequelize = new Sequelize('database', 'username', 'password', { // 定义为 postgres dialect: 'postgres' })
MSSQL 的库是 tedious@^1.7.0
你只须要定义方言:
const sequelize = new Sequelize('database', 'username', 'password', { dialect: 'mssql' })
因为经常使用简单的方式来执行原始/已经准备好的SQL查询,因此可使用“sequelize.query”函数。
这是它如何工做的:
// 原始查询的参数 sequelize.query('your query', [, options]) // 简单的例子 sequelize.query("SELECT * FROM myTable").then(myTableRows => { console.log(myTableRows) }) // 若是要返回 sequelize 实例,请使用模型选项。 // 这样,你能够轻松地将查询映射到预约义的sequelize模型,例如: sequelize .query('SELECT * FROM projects', { model: Projects }) .then(projects => { // 每一个记录如今将映射到项目的模型。 console.log(projects) }) // 选项是具备如下键的对象: sequelize .query('SELECT 1', { // 用于记录查询的函数(或false) // 每一个发送到服务器的SQL查询都会调用 logging: console.log, // 若是 plain 是 TRUE ,则 sequelize 将只返回结果集的第一条记录。 // 若是是 FALSE, 则是所有记录。 plain: false, // 若是你没有查询的模型定义,请将其设置为true。 raw: false }) // 注意第二个参数为null! // 即便咱们在这里声明一个被调用,raw: true 将取代并返回一个原始对象。 sequelize .query('SELECT * FROM projects', { raw: true }) .then(projects => { console.log(projects) })
查询中的替换能够经过两种不一样的方式完成:
使用命名参数(以:
开头),或者由未命名的
使用的语法取决于传递给函数的替换选项:
?
将按照它们在数组中出现的顺序被替换:key
将被该对象的键替换。若是包含在查询中的对象未找到对应的键,则会抛出异常,反之亦然。sequelize .query( 'SELECT * FROM projects WHERE status = ?', { raw: true, replacements: ['active'] ) .then(projects => { console.log(projects) }) sequelize .query( 'SELECT * FROM projects WHERE status = :status ', { raw: true, replacements: { status: 'active' } } ) .then(projects => { console.log(projects) })
注意一点: 若是表的属性名称包含 " . ",则生成的对象将被嵌套:
sequelize.query('select 1 as `foo.bar.baz`').then(rows => { console.log(JSON.stringify(rows)) /* [{ "foo": { "bar": { "baz": 1 } } }] */ })
若是这篇文章对您有帮助, 感谢 下方点赞 或 Star GitHub: sequelize-docs-Zh-CN 支持, 谢谢.