本文转自: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 |
+-------------+--------------------+--------+

[转]Magento2开发教程 - 如何向数据库添加新表的更多相关文章

  1. Magento2开发教程 - 如何向数据库添加新表

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

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

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

  3. 《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示

    原文:<ArcGIS Engine+C#实例开发教程>第八讲 属性数据表的查询显示 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与Page ...

  4. 在iOS开发中,给项目添加新的.framework

    首先需要了解一下iOS中静态库和动态库.framework的概念 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我 ...

  5. sqlserver学习笔记(三)—— 为数据库添加新的用户

    首先,用windows或sa身份登录sqlserver, 打开安全性——登录名——右键新建登录名:在选择页——常规中,新建命为user_b的登录名,选择sqlserver身份验证方式,设置密码确认密码 ...

  6. SQL SERVER Transactional Replication中添加新表如何不初始化整个快照

    在SQL SERVER的复制(Replication)中,有可能出现由于业务需求变更,需要新增一张表或一些表到已有的复制(发布订阅)当中,这种需求应该是很正常,也很常见的.但是在已有的复制(发布订阅) ...

  7. 【SQL server初级】SQL SERVER Transactional Replication中添加新表如何不初始化整个快照

    在SQL SERVER的复制(Replication)中,有可能出现由于业务需求变更,需要新增一张表或一些表到已有的复制(发布订阅)当中,这种需求应该是很正常,也很常见的.但是在已有的复制(发布订阅) ...

  8. SQL数据库添加新账号,只操作指定数据库

    思路: 1.创建数据库服务器登录用户 2.创建指定数据库的用户,并且和服务器用户联系起来 3.给数据库的用户添加角色 代码实现: 1.创建名为login的服务器登录用户dba,尼玛dbpwd,默认数据 ...

  9. ASP.NET Aries 高级开发教程:Excel导入之多表高级导入配置(中)

    前言: 在面对Excel的各种复杂导入情况中,多表导入是很常见的情景. 今天就来写一下多表导入是如何配置的. 1.自定义导入模板 怎么自定义: 其实就是自己新建一个Excel了,把列头都写好. 不过有 ...

随机推荐

  1. Android-Java-同步方法-synchronized

    1.方法具有封装性: /** * 1.方法具有封装性: */ public void addMoney(double moneyAsset) { this.moneyAsset += moneyAss ...

  2. csv 文件读取(input)和截分(split)方法

    下面是宝玉对学生的指导

  3. python实现Telnet远程登陆到设备并执行命令

    #encoding=utf-8 import telnetlib import time def do_telnet(Host, username, password, finish, command ...

  4. HTML给table添加单线边框

    一般来说,给表格加边框都会出现不同的问题,以下是给表格加边框后展现比较好的方式 <style> table,table tr th, table tr td { border:1px so ...

  5. .NET中的FileUpload控件的使用-Jquery(一)

    FileUpload在HTML中是个常用的基础控件,在涉及到上传各种格式的文件时候都会用到:笔者前段时间正好用到它做上传功能,记录下来做一些累积, 前端到后台用的是的Jquery中的Ajax进行数据传 ...

  6. [leetcode.com]算法题目 - Sort Colors

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  7. 【BZOJ2882】 工艺(SAM)

    传送门 BZOJCH 洛谷 Solution 这个东西要求的不就是最小表示法吗? 把原串复制一遍然后都加到后缀自动机里面去. 用个map跑一下,这样子可以保证每一次选的是最小字典序的. 然后跑\(n\ ...

  8. cad 关键字被保留了?选择集关键字保留了? N S W E关键字无法用?

    N S W E是东南西北四个方位,s是南方270度,在设置关键字的时候必须避开这四个关键字. 设置早期的R14 也有.

  9. Java - 集成开发环境Eclipse的使用方法和技巧

    00 - Eclipse教程 Eclipse 教程 01 - Eclipse设置编译和运行的环境 建议编译和运行的版本保持一致,否则请特别注意: 低编译,高运行 ---> 可行. 高编译,低运行 ...

  10. Tools - 浏览器Firefox

    简介 http://www.mozilla.org/ 中文官网:http://www.firefox.com.cn/ https://www.mozilla.org/zh-CN/firefox/ Mo ...