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

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 文件夹和创建文件夹 LearningLearning/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   |
+-------------+--------------------+--------+
时间: 2024-11-10 12:19:02

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

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

iOS 9应用开发教程之使用代码添加按钮美化按钮 丰富的用户界面 在iOS9中提供了很多的控件以及视图来丰富用户界面,对于这些视图以及控件我们在上一章中做了简单的介绍.本章我们将详细讲解这些视图. ios9中使用按钮接收用户输入 按钮是iOS应用中最常使用也是最简单的控件,它常用来响应用户的点击事件,如图2.1所示.在图2.1中,蓝色的矩形就是一个按钮,它的标题为"登录".在iOS 7以后按钮只是一块普通的文本,没有轮廓,边框,背景颜色,或其他装饰功能(为了美观,很多的应用程序中的按钮

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

首先需要了解一下iOS中静态库和动态库.framework的概念 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件.另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间. 上面提到

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

原文:<ArcGIS Engine+C#实例开发教程>第八讲 属性数据表的查询显示 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与PageLayoutControl同步 第四讲 状态栏信息的添加与实现 第五讲 鹰眼的实现 第六讲 右键菜单添加与实现 教程Bug及优化方案1 第七讲 图层符号选择器的实现1 第七讲 图层符号选择器的实现2 第八讲 属性数据表的查询显示 摘要:这一讲中,我们将实现图层属性数据表的查询显示.在ArcMap中,单击图层右

Localdb数据库添加新字段 迁移过程

您将使用实体框架代码第一次迁移迁移到模型类的一些变化,所以该更改应用于数据库 1.在App-data文件夹中的Movies.mdf文件上点击鼠标右键并选择删除来删除电影数据库 2.从工具菜单上,单击库程序包管理器,然后程序包管理器控制台. 在程序包管理器控制台窗口中 PM>提示输入 -ContextTypeName MvcMovie.Models.MovieDBContext 然后点击回车. MvcMovie是项目的名字 3.在新的迁移文件夹rationsMig中创建一个Configuratio

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

在SQL SERVER的复制(Replication)中,有可能出现由于业务需求变更,需要新增一张表或一些表到已有的复制(发布订阅)当中,这种需求应该是很正常,也很常见的.但是在已有的复制(发布订阅)当中增加新表/文章,往往需要将整个快照重新初始化,这样做虽然简单,但是往往在实际应用中会出现一些问题,例如,发布订阅的表比较多,数据量比较大,那么重新初始化快照往往需要很长一段时间,影响系统正常运行.另外就是这样做会增大服务器的负荷,影响网络带宽. 那么是否可以在新增表/文章后,不用初始化整个快照,

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

在SQL SERVER的复制(Replication)中,有可能出现由于业务需求变更,需要新增一张表或一些表到已有的复制(发布订阅)当中,这种需求应该是很正常,也很常见的.但是在已有的复制(发布订阅)当中增加新表/文章,往往需要将整个快照重新初始化,这样做虽然简单,但是往往在实际应用中会出现一些问题,例如,发布订阅的表比较多,数据量比较大,那么重新初始化快照往往需要很长一段时间,影响系统正常运行.另外就是这样做会增大服务器的负荷,影响网络带宽. 那么是否可以在新增表/文章后,不用初始化整个快照,

将csv格式的数据文件导入/导出数据库+添加新的字段

最近一直忙于实验室的事情,没有好好更新博客,在抓包的过程中,遇到了很多问题. 因为我常用Wireshark将抓包信息导出为csv文件,这里简单mark一下将csv文件导入/导出到数据库的2种方法: 一.简单,但是稍慢的方法,使用Navicat for MySQL,傻瓜式导入数据库: 流程如下: 安装完成并配置好连接后界面如下: 新建数据库 进入导入向导 选择导入类型: 然后选择文件作为数据源,这里是我之前抓好的包,300w+条抓包记录 这里直接采取默认设置 同样默认 自己设置了下表明,新建了表

ruby on rails 向数据库添加新字段

1 数据库建好以后,需要增加新字段的经历 2 3 ruby script/rails generate migration add_name_to_product name:string 4 rake db:migrate

MySQL Workbench 创建数据库,添加新表,添加字段

建立数据库 第一步: 第二步: 第三步: 如图弹出弹框,继续点击Apply按钮,最后点击Finish按钮完成数据库的建立 创建表与添加字段 双击!!!  一下刚刚建立好的数据库,然后再创建表,不然会出错,右键点击Tables 然后点击Create new tables ,填写表名,以及字段的信息,之后点击  apply ,一张表就建完了. PK: primary key (column is part of a pk)  主键 NN: not null (column is nullable)