当前位置: 首页 > 后端技术 > Node.js

Sequelize中文文档v4-Migrations-迁移

时间:2023-04-03 16:43:29 Node.js

Migrations-迁移本系列文章的应用示例已发布在GitHub上:sequelize-docs-Zh-CN。您可以Fork以帮助改进或Star以关注更新。欢迎来到星空。就像您使用Git/SVN来管理源代码更改一样,您可以使用迁移来跟踪数据库更改。迁移允许您将现有数据库移动到另一个状态,反之亦然:这些状态转换保存在迁移文件中,这些文件描述了如何进入新状态以及如何恢复更改以返回到旧状态。您将需要SequelizeCLI。CLI支持迁移和项目引导。命令行界面安装命令行界面让我们从安装CLI开始,您可以在此处找到说明。最推荐的方式是这样安装$npminstall--savesequelize-clibootstrap要创建一个空项目,需要执行init命令$node_modules/.bin/sequelizeinit这将创建如下文件夹config,包含配置文件,它告诉CLI如何连接到数据库模型,包含项目的所有模型迁移,包含所有迁移文件播种器,包含所有种子文件结构在继续之前,我们需要告诉CLI如何连接到数据库。为此,请打开默认配置文件config/config.json。看起来像这样空,数据库:'database_test',主机:'127.0.0.1',方言:'mysql'},生产:{用户名:'root',密码:null,数据库:'database_production',主机:'127.0.0.1',dialect:'mysql'}}现在编辑这个文件并设置正确的数据库凭据和方言。注意:如果你的数据库还不存在,你可以调用db:create命令。通过正确的访问,它将为您创建该数据库。创建您的第一个模型(和迁移)正确配置CLI配置文件后,您可以首先创建迁移。就像执行一个简单的命令一样简单。我们将使用model:generate命令。此命令需要两个选项名称、模型属性的名称和模型的属性列表让我们创建一个名为User的模型$node_modules/.bin/sequelizemodel:generate--nameUser--attributesfirstName:string,lastName:string,email:string这将发生以下事情在模型文件夹中创建了一个用户模型文件在迁移文件夹中创建了一个名为XXXXXXXXXXXXXX-create-user.js的迁移文件注意:Sequelize将仅使用模型文件,它是表说明。另一方面,迁移文件是对模型的更改,或者更具体地说是CLI使用的表。处理迁移,如提交或日志,以对数据库进行一些更改。运行迁移到目前为止,CLI没有向数据库中插入任何内容。我们刚刚为我们的第一个模型用户创建了所需的模型和迁移文件。现在要在数据库中实际创建表,您需要运行db:migrate命令。$node_modules/.bin/sequelizedb:migrate该命令将执行这些步骤,并确保数据库中有一个名为SequelizeMeta的表。该表用于记录在当前数据库上运行的迁移开始查找任何尚未运行的迁移文件。这可以通过检查SequelizeMeta表来完成。在此示例中,它将运行我们在上一步中创建的XXXXXXXXXXXXXX-create-user.js迁移。创建一个名为User的表,其中包含在其迁移文件中指定的所有列。撤消迁移现在我们的表已创建并保存在数据库中。通过迁移,您只需运行一条命令即可恢复到旧状态。您可以使用db:migrate:undo,这将撤消最近的迁移。$node_modules/.bin/sequelizedb:migrate:undo通过使用db:migrate:undo:all命令撤消所有迁移来恢复到原始状态。您还可以通过将其名称传递到--to选项来恢复到特定迁移。$node_modules/.bin/sequelizedb:migrate:undo:all--toXXXXXXXXXXXXXX-create-posts.js创建第一个种子假设我们要默认插入一些数据到几个表中。如果我们继续前面的例子,我们可以考虑为User表创建一个演示用户。要管理所有数据迁移,您可以使用播种机。种子文件是数据的变体,可用于用样本或测试数据填充数据库表。让我们创建一个种子文件,它将向我们的用户表添加一个演示用户。$node_modules/.bin/sequelizeseed:generate--namedemo-user此命令将在seeders文件夹中创建一个种子文件。文件名类似于XXXXXXXXXXXXXX-demo-user.js,它遵循与迁移文件相同的上/下语义。现在我们应该编辑这个文件以将演示用户插入到用户表中。'usestrict';module.exports={up:(queryInterface,Sequelize)=>{returnqueryInterface.bulkInsert('Users',[{firstName:'John',lastName:'Doe',email:'demo@demo.com'}],{});},down:(queryInterface,Sequelize)=>{returnqueryInterface.bulkDelete('Users',null,{});}};运行种子在上一步中,您创建了一个torrent文件。但是它还没有保存到数据库中。为此,我们需要运行一个简单的命令。$node_modules/.bin/sequelizedb:seed:all这将执行种子文件,您将在用户表中插入一个演示用户。注意:播种器执行不会存储在使用SequelizeMeta表的任何迁移中。如果您想覆盖它,请阅读存储部分撤销播种机如果使用了任何存储,则可以将其撤销。有两个命令可用如果你想撤消最近的种子node_modules/.bin/sequelizedb:seed:undo如果你想撤消所有种子node_modules/.bin/sequelizedb:seed:undo:all高级主题迁移框架以下框架显示了一个典型的迁移文件。module.exports={up:(queryInterface,Sequelize)=>{//转换到新状态的逻辑},down:(queryInterface,Sequelize)=>{//恢复变化的逻辑}}可以使用传递的queryInterface对象修改数据库。Sequelize对象存储可用的数据类型,例如STRING或INTEGER。函数up或down应该返回一个Promise。让我们看一个例子module.exports={up:(queryInterface,Sequelize)=>{returnqueryInterface.createTable('Person',{name:Sequelize.STRING,isBetaMember:{type:Sequelize.BOOLEAN,defaultValue:false,allowNull:错误的}});},down:(queryInterface,Sequelize)=>{returnqueryInterface.dropTable('Person');}}.sequelizerc文件这是一个特殊的配置文件。它允许您指定通常作为参数传递给CLI的各种选项。在某些情况下,您可以使用它。您想要覆盖迁移、模型、播种器或配置文件夹的路径。您想将config.json重命名为database.json等其他名称,让我们看看如何使用此文件进行自定义配置。对于初学者,在项目的根目录中创建一个空文件。$touch.sequelizerc现在适用于示例配置。constpath=require('路径');module.exports={'config':path.resolve('config','database.json'),'models-path':path.resolve('db','models'),'seeders-path':路径.resolve('db','seeders'),'migrations-path':path.resolve('db','migrations')}使用此配置,您可以告诉CLI:使用config/database.json文件来配置设置使用db/models作为模型文件夹使用db/seeders作为种子文件夹使用db/migrations作为迁移文件夹动态配置配置文件默认是一个名为config.json的JSON文件。但有时你想执行一些代码或访问环境变量,这在JSON文件中是不可能的。SequelizeCLI可以读取“JSON”和“JS”文件。这可以使用.sequelizerc文件进行设置。让我们看一下首先,您需要在项目的根文件夹中创建一个.sequelizerc文件。此文件应覆盖JS文件的配置路径。推荐这个constpath=require('path');module.exports={'config':path.resolve('config','config.js')}现在,SequelizeCLI将加载config/config.js以获取配置选项。由于这是一个JS文件,您可以执行任何代码并导出最终的动态配置文件。config/config.js文件示例constfs=require('fs');module.exports={development:{username:'database_dev',password:'database_dev',database:'database_dev',host:'127.0.0.1',方言:'mysql'},测试:{用户名:'database_test',密码:null,数据库:'database_test',主机:'127.0.0.1',方言:'mysql'},生产:{用户名:进程.env.DB_USERNAME,密码:process.env.DB_PASSWORD,数据库:process.env.DB_NAME,主机:process.env.DB_HOSTNAME,方言:'mysql',dialectOptions:{ssl:{ca:fs.readFileSync(__dirname+'/mysql-ca-master.crt')}}}};使用环境变量使用CLI,您可以直接访问config/config.js中的环境变量。您可以使用.sequelizerc告诉CLI使用config/config.js进行配置。这在上一节中进行了解释。然后您可以使用正确的环境变量公开该文件。module.exports={开发:{用户名:'database_dev',密码:'database_dev',数据库:'database_dev',主机:'127.0.0.1',方言:'mysql'},测试:{用户名:process.env。CI_DB_USERNAME,密码:process.env.CI_DB_PASSWORD,数据库:process.env.CI_DB_NAME,主机:'127.0.0.1',方言:'mysql'},生产:{用户名:process.env.PROD_DB_USERNAME,密码:process.env。PROD_DB_PASSWORD,database:process.env.PROD_DB_NAME,host:process.env.PROD_DB_HOSTNAME,dialect:'mysql'}Specifydialectoption有时候想指定一个dialectOption,如果是普通配置,可以在config/config中添加.json。有时你想执行一些代码来获取dialectOptions,你应该在这些情况下使用动态配置文件。{"production":{"dialect":"mysql","dialectOptions":{"bigNumberStrings":true}}}生产使用在生产环境中使用CLI和迁移设置的一些技巧。1)使用环境变量进行配置设置。这可以通过动态配置更好地实现。示例生产安全配置可能类似于constfs=require('fs');module.exports={development:{username:'database_dev',password:'database_dev',database:'database_dev',host:'127.0.0.1',方言:'mysql'},测试:{用户名:'database_test',密码:null,数据库:'database_test',主机:'127.0.0.1',方言:'mysql'},生产:{用户名:过程。env.DB_USERNAME,密码:process.env.DB_PASSWORD,数据库:process.env.DB_NAME,主机:process.env.DB_HOSTNAME,方言:'mysql',dialectOptions:{ssl:{ca:fs.readFileSync(__dirname+'/mysql-ca-master.crt')}}}};我们的目标是偷偷使用各种数据库的环境变量,而不是不小心在源代码管理中检查它们。存储提供三种类型的存储:sequelize、json和none。sequelize:将迁移和种子存储在sequelize数据库的表中json:将迁移和种子存储在json文件中none:不存储任何迁移/种子一个表,其中包含执行的每个迁移的条目。要更改此行为,可以将三个选项添加到配置文件中。使用migrationStorage选择用于迁移的存储类型。如果选择json,则可以使用migrationStoragePath指定文件路径,否则CLI将写入sequelize-meta.json文件。如果要将数据保存在数据库中,请使用sequelize,但如果要使用其他表,则可以使用migrationStorageTableName。{"development":{"username":"root","password":null,"database":"database_development","host":"127.0.0.1","dialect":"mysql",//使用不同的存储类型。默认值:sequelize"migrationStorage":"json",//使用不同的文件名。默认值:sequelize-meta.json"migrationStoragePath":"sequelizeMeta.json",//使用不同的表名。Default:SequelizeMeta"migrationStorageTableName":"sequelize_meta"}}注意:不建议使用none存储作为迁移存储。如果您决定使用它,请注意不会有任何移动或未运行的记录。种子存储默认情况下,CLI不保存任何已执行的种子。如果您选择更改此行为(!),则可以在配置文件中使用seederStorage来更改存储类型。如果选择json,则可以使用seederStoragePath指定文件路径,否则CLI将写入文件sequelize-data.json。如果要将数据保存在数据库中,使用sequelize,可以使用seederStorageTableName指定表名,否则默认为SequelizeData。{"development":{"username":"root","password":null,"database":"database_development","host":"127.0.0.1","dialect":"mysql",//使用不同储存空间。默认值:无"seederStorage":"json",//使用不同的文件名。默认值:sequelize-data.json"seederStoragePath":"sequelizeData.json",//使用不同的表名默认值:SequelizeData"seederStorageTableName":"sequelize_data"}}配置连接字符串作为--config选项的替代方案,您可以使用定义数据库的配置文件,您可以使用--url选项传递连接字符串。例如:$node_modules/.bin/sequelizedb:migrate--url'mysql://root:password@mysql_host.com/database_name'通过SSL连接确保在dialectOptions和基本配置中指定了ssl。{"production":{"dialect":"postgres","ssl":true,"dialectOptions":{"ssl":true}}}以编程方式使用Sequelize有一个姊妹库,用于以编程方式执行和记录处理迁移任务。在使用queryInterface对象描述查询接口之前,您可以更改数据库架构。查看完整的公共方法列表,它支持QueryInterfaceAPI如果本文对您有帮助,感谢在下方点赞或StarGitHub:sequelize-docs-Zh-CN支持,谢谢。