Declarative Schema in Magento 2.3

#Declarative Schema in Magento 2.3

Magento has introduced a new feature called Declarative Schema which aims to simplify the Magento installation and upgrade processes. This new concept will allow a developer to get away from writing updates for each new version in favour of declaring the final result that the developer wants to achieve.


#How to use Declarative Schema in Magento 2.3

we will only discuss file required for a Declarative Schema.

Firstly create a file `db_schema.xml` inside the folder `Karabiner/Declarative/etc` and write the following code

 
```xml:db_schema.xml
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"    xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
  <table name="author_data" resource="default" engine="innodb" comment="Author Table">
     <column xsi:type="smallint" name="id" padding="6" unsigned="false" nullable="false" identity="true" comment="Author ID"/>
          <column xsi:type="varchar" name="author_name" nullable="false" length="255" comment="Author Name"/>
          <column xsi:type="varchar" name="author_email" nullable="false" length="255" comment="Author Email"/>
          <column xsi:type="varchar" name="affliation" nullable="false" length="255" comment="Affliation"/>
          <column xsi:type="int" name="age" unsigned="true" nullable="true" identity="false" default="" comment="Age"/>
          <constraint xsi:type="primary" name="PRIMARY">
             <column name="id"/>
          </constraint>
  </table>
</schema> 
```
 
Each table node represents a table in the database.

A table node can contain three types of subnodes:

- Column
- Constraint
- Index


So when you run `setup:upgrade` command then it will create the table “author_data”

 

###Adding New Column
If you want to add a new column to the existing table then you need to add a new column node in db_schema.xml and on running upgrade command it will add the new column.

 
```xml:db_schema.xml
<column xsi:type="int" name="new_column" unsigned="true" nullable="true" identity="false" default="" comment="New column"  />
```
###Remove Existing Column
Now if you want to remove the existing column then you either need to remove the column node (< column >) inside the table node or you can set the `disabled` attribute to `true`. 

 
```xml:db_schema.xml
<column xsi:type="int" name="age" unsigned="true" nullable="true" identity="false" default="" comment="Age" disabled=”true” />
```


But before running the upgrade command you need to add your schema to db_whitelist_schema.json file by running the following command-

```bash
php bin/magento setup:db-declaration:generate-whitelist --module-name=Karabiner_Declarative 
```


`Karabiner_Declarative` is a module name. You need to specify your module name there. 

Now on running `setup:upgrade` command, it will remove the column.

Changing the column type
You can change the column type, changing its type attribute to int, varchar, text etc.

 

##Renaming a column
To rename a column you need to first remove the one you don’t want and add another column with your desired name. Now you need to migrate that column data into a newly created one, to do this you need to set an attribute on Create which will migrate data from the old column.
If we want to rename the author_email column to just email,  we will remove the author column and add a new one.

 

```xml:db_schema.xml
<column xsi:type="varchar" name="email" onCreate="migrateDataFrom(author_email)" on_update="false" nullable="false" default="" comment="Author Email"/>
<column xsi:type="int" name="email" unsigned="true" nullable="true" identity="false" default="" comment="Email" disabled=”true” />
```

So this will create a new column ‘email’ with data from the removed column.


##Drop a Table
To drop a table, either remove the entire table node from `db_schema.xml` or set the `disabled` attribute to `true`. 


```xml:db_schema.xml
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"    xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
  <table name="author_data" resource="default" engine="innodb" comment="Author Table" disabled=”true”>
   ....
  </table>
</schema> 
```