本文转自:https://www.cnblogs.com/xz-src/p/6920365.html

Magento 2具有特殊的机制,允许你创建数据库表,修改现有的,甚至添加一些数据到他们(如安装数据,已被添加在模块安装)。 这种机制允许这些变化可以在不同的设备之间传输。

关键的概念是,而不是做你能做的一次又一次重新安装系统时,手动SQL操作,开发人员创建一个安装(或升级)脚本包含数据。 每次安装模块时,脚本将被执行。

Magento 2有四种类型的脚本:installschema,installdata,upgradeschema和upgradedata。 安装脚本只执行一次,而升级脚本每次执行模块版本被更改时执行。

要查看所有四种脚本类型,我们将完成以下问候页任务:

  • 创建 greeting_message 表和列greeting_id 和 message.
  • 添加两个记录: “Happy New Year”, “Happy Holidays”.
  • 接下来,修改表添加另一个字段,“season”,我们添加了记录“Happy Thanksgiving”和“Fall”。
  • 更新第一和第二记录的类型。

我们需要采取的步骤来完成这些任务:

  1. 创建新模块.
  2. 创建 InstallSchema 脚本.
  3. 创建 InstallData 脚本.
  4. 添加一个新模块并验证创建数据表。
  5. 创建 UpgradeSchema 脚本.
  6. 创建 UpgradeData 脚本.
  7. 运行升级脚本并验证表已更改。

让我们走过每一步。

1:创建新模块

创建新模块 Learning_GreetingMessage.

进入app/code 文件夹和创建文件夹 Learning 个 Learning/GreetingMessage:

$ cd <magento2_root>/app/code
$ mkdir Learning
$ mkdir Learning/GreetingMessage

现在创建两个文件:

Learning/GreetingMessage/registration.php

/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/\Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Learning_GreetingMessage', __DIR__ );

Learning/GreetingMessage/etc/module.xml

<?xml version="1.0"?>
<!--
/**
* Copyright © 2016 Magento. All rights reserved.
* * See COPYING.txt for license details. --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Learning_GreetingMessage" setup_version="0.0.1"> </module> </config>

2: 创建 InstallSchema 脚本

创建一个InstallSchema脚本,在 app/code/Learning/GreetingMessage 文件夹 和创建一个Setup 文件夹。

$ cd <magento2_root>/app/code/Learning/GreetingMessage
$ mkdir Setup

创建 Setup/InstallSchema.php文件

/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/namespace Learning\GreetingMessage\Setup; use Magento\Framework\Setup\InstallSchemaInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\SchemaSetupInterface; /**  * @codeCoverageIgnore  */ class InstallSchema implements InstallSchemaInterface { /**  * {@inheritdoc}  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)  */ public function install(SchemaSetupInterface $setup, ModuleContextInterface $context) { /**  * Create table 'greeting_message'  */ $table = $setup->getConnection() ->newTable($setup->getTable('greeting_message')) ->addColumn( 'greeting_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true], 'Greeting ID' ) ->addColumn( 'message', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 255, ['nullable' => false, 'default' => ''], 'Message' )->setComment("Greeting Message table"); $setup->getConnection()->createTable($table); } }

让我们花点时间看看代码。

installschema文件都是非常典型的。 主代码位于install() 方法,有一个 $setup 参数。 这是一个关键参数,因为它提供了访问 Connection() 允许数据库操作的。

连接是 Magento\Framework\DB\Adapter\Pdo\Mysql 一个实例类。

Magento使用DDL(数据定义语言)来操纵数据库。 你可以在Magento 2核心代码找到DDL的各种例子。

3:创建 InstallData 脚本

创建 Setup/InstallData.php 文件:

/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */namespace Learning\GreetingMessage\Setup; use Magento\Framework\Setup\InstallDataInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\ModuleDataSetupInterface; /**  * @codeCoverageIgnore  */ class InstallData implements InstallDataInterface { /**  * {@inheritdoc}  * @SuppressWarnings(PHPMD.CyclomaticComplexity)  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)  * @SuppressWarnings(PHPMD.NPathComplexity)  */ public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) { /**  * Install messages  */ $data = [ ['message' => 'Happy New Year'], ['message' => 'Marry Christams'] ]; foreach ($data as $bind) { $setup->getConnection() ->insertForce($setup->getTable('greeting_message'), $bind); } } }

4: 添加新模块并验证创建数据表

现在是运行安装脚本并验证带有初始数据的表的时候了,所以我们将运行setup:upgrade 脚本。

$ cd <magento2_root>
$ php bin/magento setup:upgrade

你应该看到一长串包含的模块Learning_GreetingMessage.

现在让我们连接数据库: mysql -u<user> -p<password> <database>

SHOW TABLES LIKE “%greeting%”+------------------------------------+
| Tables_in_magento_210 (%greeting%) |
+------------------------------------+
| greeting_message                   |
+------------------------------------+SELECT * FROM greeting_message;+-------------+-----------------+
| greeting_id | message         |
+-------------+-----------------+
| 1           | Happy New Year  |
| 2           | Happy Holidays  |
+-------------+-----------------+

检查表和数据是否存在

这是怎么工作的? 当你创建新模块运行 bin/magento setup:upgrade 脚本,Magento的检查代码,看有没有安装模块。 如果它找到任何,它检查是否有任何安装脚本,如果是的话,运行它们。 在那之后,Magento更新表格setup_module提出关于模块的版本信息有:

SELECT * FROM setup_module WHERE module='Learning_GreetingMessage';+--------------------------+----------------+--------------+
| module                   | schema_version | data_version |
+--------------------------+----------------+--------------+
| Learning_GreetingMessage | 0.0.1          | 0.0.1        |
+--------------------------+----------------+--------------+

5: 创建 UpgradeSchema 脚本

要查看升级脚本如何工作,我们将向数据库添加一些数据。

首先,改变版本在 etc/module.xml 文件为0.0.2:

<module name="Learning_GreetingMessage" setup_version="0.0.2">

创建文件 Setup/UpgradeSchema.php:

/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */namespace Learning\GreetingMessage\Setup; use Magento\Framework\Setup\UpgradeSchemaInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\SchemaSetupInterface; /**  * Upgrade the Catalog module DB scheme  */ class UpgradeSchema implements UpgradeSchemaInterface { /**  * {@inheritdoc}  */ public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context) { $setup->startSetup(); if (version_compare($context->getVersion(), '0.0.2', '<')) { $setup->getConnection()->addColumn( $setup->getTable('greeting_message'), 'season', [ 'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 'length' => 16, 'nullable' => false, 'default' => '', 'comment' => 'Season' ] ); } $setup->endSetup(); } }

注意“version_compare”线。 如前所述,该upgradescript将每一次的版本中执行module.xml。 因此,我们只希望当前的版本升级脚本执行,而不是以前的升级。 这就是为什么我们把升级纳入“如果”条款。

6: 创建 UpgradeData 脚本

创建文件 Setup/UpgradeData.php:

/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */namespace Learning\GreetingMessage\Setup; use Magento\Framework\Setup\UpgradeDataInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\ModuleDataSetupInterface; /**  * Upgrade Data script  */ class UpgradeData implements UpgradeDataInterface { /**  * {@inheritdoc}  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)  */ public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context) { $setup->startSetup(); if ($context->getVersion() && version_compare($context->getVersion(), '0.0.2') < 0 ) { $table = $setup->getTable('greeting_message'); $setup->getConnection() ->insertForce($table, ['message' => 'Happy Thanksgiving, 'season' => 'fall']);  $setup->getConnection()  ->update($table, ['season' => 'winter'], 'greeting_id IN (1,2)'); } $setup->endSetup(); } }

7: 运行升级脚本并验证表已更改

我们会再次运行setupupgrade脚本:

$ cd <magento2_root>
$ php bin/magento setup:upgrade

现在,我们可以连接到数据库,并验证我们的变化:

select * from greeting_message;+-------------+--------------------+--------+
| greeting_id | message            | season |
+-------------+--------------------+--------+
| 1           | Happy New Year     | winter |
| 2           | Happy Holidays     | winter |
| 3           | Happy Thanksgiving | fall   |
+-------------+--------------------+--------+

转载于:https://www.cnblogs.com/freeliver54/p/9140193.html

[转]Magento2开发教程 - 如何向数据库添加新表相关推荐

  1. iOS 9应用开发教程之使用代码添加按钮美化按钮

    iOS 9应用开发教程之使用代码添加按钮美化按钮 丰富的用户界面 在iOS9中提供了很多的控件以及视图来丰富用户界面,对于这些视图以及控件我们在上一章中做了简单的介绍.本章我们将详细讲解这些视图. i ...

  2. 物联网国赛LORA模块开发教程(通用库)—Keil添加注释的快捷键

    LORA模块开发教程目录 物联网国赛LORA模块开发教程-开发环境配置 物联网国赛LORA模块开发教程-Keil添加注释的快捷键 物联网国赛LORA模块开发教程-点亮第一颗LED灯 物联网国赛LORA ...

  3. 物联网应用技术竞赛 ——数据库添加新用户映射

    在服务器电脑上的数据库使用 sa 帐号登录,完成新零售门店数据库.智能 市政数据库的添加. 注意:如果这两个数据库未添加成功,会对后续部分任务造成影响. 在服务器电脑上的数据库中创建名为"d ...

  4. 在mysql中如何添加函数库_详细讲解如何为MySQL数据库添加新函数

    你可以通过自定义函数接口 (UDF)来添加函数.自定义函数被编译为目标文件,然后用CREATE FUNCTION 和DROP FUNCTION 声明动态地添入到服务器中及从服务器中移出. 你可以将函数 ...

  5. Sql Server发布订阅如何添加新表如何不初始化整个快照

    Sql Server按照默认配置发布订阅,之后如果要在该发布中添加一张或多张新表时,启动快照代理,会将整个发布全部初始化,如果数据量巨大,可能会灾难性的初始化几个甚至十几个小时,而且无法挽回,因此在做 ...

  6. oracle云平台开发教程,Oracle云数据库初体验 之四 - APEX 快速开发

    在Oracle的Cloud Database服务中,开发环境是集成的Oracle Application Express环境, Oracle Application Express (Oracle A ...

  7. Java开发教程入门!数据库事务深入分析

    咱先来聊聊Redis 像Redis的基础入门,掌握下图这几个列出来的知识点足以了. 进阶的话,就得下点功夫了,事务.主从复制.哨兵.集群等等之类的搞不明白你就上不去呀. 再看美团亿级流量Redis实战 ...

  8. php中数据库怎样增加一列,php – 向wordpress数据库添加新列

    我尝试更新我的插件.所以我必须升级mysql_table.但是在尝试新列时,程序会获得异常. 这是我目前的表格: $sql = "CREATE TABLE {$table_name} ( s ...

  9. 【微信小程序企业级开发教程】界面刷新获取新更新数据

    在微信小程序开发的过程中,在一个页面中对数据操作之后我们大多数时间都需要刷新一下当前界面以把操作之后的结果显示出来,但是如何在执行操作后进行本页面的刷新就成了一个问题很大但是很需要的操作.下面介绍一下 ...

  10. 怎么html中加样式,简明教程 在HTML中添加样式表的方法

    CSS语句内嵌到HTML文档内的方法有四种. 1.最直接的方法是将CSS样式语句直接写在HTML的标识符(tag)里: <Tag style="properties"> ...

最新文章

  1. matplotlib的安装
  2. 4.5 人脸验证与二分类-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  3. 关于公司内部域名称是否要和外部真实域名称对应的问题
  4. 机器学习(一)——熟悉tensorflow2.0
  5. python--装饰器(附偏函数、断言)
  6. Spring MVC核心知识
  7. 河南扫黑除恶一年审结案件432宗判处3355人
  8. mysql创建数据库与表_PHP MySQL 创建数据库和表 之 Create
  9. “围剿”余额宝!微信零钱通能否逆袭成功?| 畅言
  10. 王道 计算机网络试题讲解_2016年计算机网络考研真题及解析
  11. WINDOWS常用端口
  12. TV TimeShift和PVR的区别
  13. Common Lisp
  14. WIN7系统没有USB驱动和以太网驱动如何操作
  15. mybatis 的大于号 小于号 大于等于 小于等于
  16. 【软件与系统安全】笔记与期末复习
  17. 哪些方法可以用来提高微信小程序的应用速度?
  18. 计算机科学与技术学校学科评估,计算机科学与技术学科评估具体排名「大学专业排名」...
  19. 5G、LPWAN、SDN、NFV、TSN…一文带你看懂物联网“网”的本质
  20. 准确率、精度和召回率

热门文章

  1. css之限制文本行数,超出部分显示 “...“
  2. Debian Ubuntu/Centos7设置某些软件不自动更新
  3. 两台服务器ubuntu20.x 直接文件共享,文件挂载 nfs
  4. mac中安装使用podman,替换docker
  5. Nginx PHP Apache 隐藏版本号/禁止显示版本号
  6. mysql java 日期_Mysql和JAVA中的几个日期操作
  7. 小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_35、事务介绍和常见的隔离级别,传播行为...
  8. Spring Boot2.x 的Druid连接池配置[附带监控]
  9. docker 部署 redmine 项目管理软件
  10. 第十八次ScrumMeeting博客