Command to migrate database to Yii 2.0




While learning Yii 2.0, I came across different ways to migrate my database. I usually follow from the [yii 2 guide](https://translate.googleusercontent.com/translate_c?depth=1&pto=aue&rurl=translate.google.com&sl=ru&sp=nmt4&tl=en&u=) .


Using this tutorial, I am using commands like **yii migrate / create migfile** and **yii migrate**


Usually in my migration file **up ()** , I would insert code like this:



```
$this->createTable('news', [
        'id' => Schema::TYPE_PK,
        'title' => Schema::TYPE_STRING . ' NOT NULL',
        'content' => Schema::TYPE_TEXT,
]);

        

        
        
        
 (adsbygoogle = window.adsbygoogle || []).push({});
 
        

    
```

However, I've also seen some tutorials like [this](https://translate.googleusercontent.com/translate_c?depth=1&pto=aue&rurl=translate.google.com&sl=ru&sp=nmt4&tl=en&u=) one that uses a slightly different command and code in the migration file. From the second tutorial i used php yii migrate / create migfile


Whereas the syntax used in the up () method of the migration file was something like this:



```
return $this->createTable('posts', [
        'id' => 'INT PRIMARY KEY AUTO\_INCREMENT',
        'title' => 'VARCHAR(255)',
        'content' => 'TEXT',

        

        
        
        
 (adsbygoogle = window.adsbygoogle || []).push({});
 
        

    
```

Now this has led to a lot of questions. 1. Is there any difference between **php** command **yii** and **yii** ? 2. What's the difference between using **Schema ::** and not using it? Is this the best approach when migrating a database, as this is what the Yii migration guide says, or is it just a matter of preference that can be used?
1) Usage `yii`
  




 (adsbygoogle = window.adsbygoogle || []).push({});
 
  

and `php yii`
  




 (adsbygoogle = window.adsbygoogle || []).push({});
 
  

exactly the same. If you look at the file `yii`
  




 (adsbygoogle = window.adsbygoogle || []).push({});
 
  

, you'll see it in the first line `#!/usr/bin/env php`
  




 (adsbygoogle = window.adsbygoogle || []).push({});
 
  

. This is called the "shebang" syntax and instructs your shell to automatically execute the `yii`
  




 (adsbygoogle = window.adsbygoogle || []).push({});
 
  

script using binary code `php`
  




 (adsbygoogle = window.adsbygoogle || []).push({});
 
  

. See: [https://en.wikipedia.org/wiki/Shebang\_%28Unix%29](https://translate.googleusercontent.com/translate_c?depth=1&pto=aue&rurl=translate.google.com&sl=ru&sp=nmt4&tl=en&u=)


2) The difference here is flexibility. If you use the syntax `Schema::TYPE_PK`
  




 (adsbygoogle = window.adsbygoogle || []).push({});
 
  

, Yii will automatically detect the exact column type based on your database database. For example, it `Schema::TYPE_PK`
  




 (adsbygoogle = window.adsbygoogle || []).push({});
 
  

translates to `int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY`
  




 (adsbygoogle = window.adsbygoogle || []).push({});
 
  

in MySQL, but if you use Postgres as your database, it will translate to `serial NOT NULL PRIMARY KEY`
  




 (adsbygoogle = window.adsbygoogle || []).push({});
 
  

. [1]



  




 (adsbygoogle = window.adsbygoogle || []).push({});
 
  

In practice, it is unlikely which method you are using because you are probably not going to switch to a different type of database halfway through your project, and therefore there is no need for your migration scripts to be database agnostic. Based on your preference, you can choose the syntax `Schema`
  




 (adsbygoogle = window.adsbygoogle || []).push({});
 
  

for added flexibility, or for a hard-coded syntax to make your hyphenation definitions more readable for future readers.


[1] See [https://github.com/yiisoft/yii2/blob/master/framework/db/pgsql/QueryBuilder.php#L21](https://translate.googleusercontent.com/translate_c?depth=1&pto=aue&rurl=translate.google.com&sl=ru&sp=nmt4&tl=en&u=) and [https://github.com/yiisoft/yii2/blob/master/framework /db/mysql/QueryBuilder.php#L24](https://translate.googleusercontent.com/translate_c?depth=1&pto=aue&rurl=translate.google.com&sl=ru&sp=nmt4&tl=en&u=)
If your intent is to move a file from one iSeries (or System i) to another iSeries/System i then I’m not sure why you are going through the intermediate step of a text file. But in any case, if you have TCP/IP up between the two systems then FTP is the way to go.


If you just want the data, ftp the file.


If you want the database:  

Create a save file on the source system  

Save the database to the save file  

Create a save file on the target system  

FTP the save file to the target system in binary mode  

Restore the database on the target system


If you’re not familiar with FTP let us know. We can guide you through the steps (there aren’t many). If you don’t have TCP/IP between the two systems, let us know what options you do have in transferring data between the two systems (SNA, tape, etc).


Bruce Vining Here is a link to assist you.


<https://technet.microsoft.com/en-us/library/ms178078(v=sql.105).aspx>


If you had done a web search with the question you entered here, you would have found multiple sites that give you the instructions Lets say you want to send a table with a single column of GUIDs.


First we need to create a structure using [SqlMetaData](https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.server.sqlmetadata(v=vs.110).aspx) which represents the schema of the table (columns).



```
var tableSchema = new List<SqlMetaData>(1)
{
  new SqlMetaData("Id", SqlDbType.UniqueIdentifier)
}.ToArray();

```

Next you create a list of records that match the schema using [SqlDataRecord](https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.server.sqldatarecord(v=vs.110).aspx).



```
var tableRow = new SqlDataRecord(tableSchema);
tableRow.SetGuid(0, Guid.NewGuid());
var table = new List<SqlDataRecord>(1)
{
  tableRow
};

```

Then create the [SqlParameter](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter(v=vs.110).aspx):



```
var parameter = new SqlParameter();
parameter.SqlDbType = SqlDbType.Structured;
parameter.ParameterName = "@UserIds";
parameter.Value = table;

var parameters = new SqlParameter[1]
{
  parameter
};

```

Then simply call the stored procedure by using the [Database.SqlQuery](https://msdn.microsoft.com/en-us/library/gg696545(v=vs.113).aspx).



```
IEnumerable<ReturnType> result;
using (var myContext = new DbContext())
{
  result = myContext.Database.SqlQuery<User>("GetUsers", parameters)
    .ToList();         // calls the stored procedure
    // ToListAsync();  // Async
{

```

In SQL Server, create your User-Defined Table Type (I suffix them with TTV, Table Typed Value):



```
CREATE TYPE [dbo].[UniqueidentifiersTTV] AS TABLE(
  [Id] [uniqueidentifier] NOT NULL
)
GO

```

Then specify the type as a parameter (don't forget, Table Type Values have to be readonly!):



```
CREATE PROCEDURE [dbo].[GetUsers] (
  @UserIds [UniqueidentifiersTTV] READONLY
) AS
BEGIN
  SET NOCOUNT ON

  SELECT u.* -- Just an example :P
  FROM [dbo].[Users] u
  INNER JOIN @UserIds ids On u.Id = ids.Id
END

``` You can call `context.Database.Migrate()`in your `Startup.cs`


eg:



```
using (var context = new MyContext(...))
{
    context.Database.Migrate();
}

``` Change this line of code (sql query) into:



```
OleDbCommand cmd = new OleDbCommand(Stirng.Format("INSERT INTO CHILDREN2 (Emp_ID , Child_Name, Age) VALUES ({0}, {1}, {2})", Convert.ToInt32(CaptionText.Text),txtName.Text, txtAge), clsData.con);
```

Do you have a WHERE clause too? I removed it from your query, becasue it didnt belonge on that place where you put it.  

If you will use a Where clause then create an sql query this was:



```
"INSERT INTO TableName (Field1, Field2) VALUES (@paramField1, @paramField2) WHERE Field3 = @paramField3"
```

where params are parameters passed to the fields, and WHERE is a conditional clause, and has to be stated on the end (after specifying parameters). hello, the easiest way to fix that would be to alter your existing user with the following: alter user myuser identified with mysql\_native\_password by 'mypassword'; another thing that you could do is to create a new user with mysql\_native\_password. to do that you could use the following: create user 'your\_user'@'your\_server\_ip ' identified with mysql\_native\_password by 'your\_password'; also as mentioned by @kavo13, try to upgrade php to 7.2 as well. after that, it should all work as normal. i’ve created a quick video demo on how to do that: i’m running the test on an ubuntu 18.04 droplet. hope that this helps! regards, bobby A couple of notes to get started:



> 
> .apply(literal\_eval)
> 
> 
> 


Wouldn't this be better as `map`?



> 
> I then re-create the Dask DF:
> 
> 
> ddf = dd.from\_pandas(ddf\_out, npartitions=nCores)
> 
> 
> 


`ddf_out` was already a dask dataframe, I don't know why you had to do this.



> 
> The columns in result seem to match those in metadir.
> 
> 
> 


The value of `result.columns` is taken from the meta you provided, no computing happens until you ask for it (dask is lazy in most operations). Does the ValueError exception not provide further information?


Here is a full example



```
x = ({'F9_07_PZ_COMP_DIRECT': '0',
  'F9_07_PZ_DIRTRSTKEY_NAME': 'DEBRA MEALY',
  'F9_07_PZ_COMP_OTHER': '0',
  'F9_07_PZ_COMP_RELATED': '0',
  'F9_07_PZ_TITLE': 'CHAIR PERSON',
  'F9_07_PZ_AVE_HOURS_WEEK': '1.00',
  'F9_07_PC_TRUSTEE_INDIVIDUAL': 'X'},
 {'F9_07_PZ_COMP_DIRECT': '0',
  'F9_07_PZ_DIRTRSTKEY_NAME': 'HELEN GORDON',
  'F9_07_PZ_COMP_OTHER': '0',
  'F9_07_PZ_COMP_RELATED': '0',
  'F9_07_PZ_TITLE': 'VICE CHAIR',
  'F9_07_PZ_AVE_HOURS_WEEK': '1.00',
  'F9_07_PC_TRUSTEE_INDIVIDUAL': 'X'})
df = pd.DataFrame({'a': x})
d = dd.from_pandas(df, 1)
meta = pd.DataFrame(columns=['F9_07_PZ_COMP_DIRECT', 
       'F9_07_PZ_DIRTRSTKEY_NAME',
       'F9_07_PZ_COMP_OTHER', 'F9_07_PZ_COMP_RELATED', 'F9_07_PZ_TITLE',
       'F9_07_PZ_AVE_HOURS_WEEK', 'F9_07_PC_TRUSTEE_INDIVIDUAL'], dtype="O")
d.map_partitions(lambda df: df.a.apply(pd.Series), meta=meta).compute()

```

How did I know what `meta` to use? I applied the function to the pandas dataframe - you might use a small piece of the dataframe to do this.


Some additional notes:


* it is an anti-pattern to load the data with pandas, pass to dask workers and then gather the whole result back to a pandas (in memory) dataframe, you are very unlikely to see a speedup this way and may incur a lot of overhead. You are better off loading with something like `dd.read_csv`, and aggregating or writing with dask functions too. Only `compute()` on something that will be small or not return anything (because it involves writing the output). The official examples do not use from\_pandas.
* string and dict processing are python methods, and so hold the interpreter lock (GIL) of any python function: threads will not actually run in parallel. To get parallelism, you need to run in processes, which is most easily achieved using <https://docs.dask.org/en/latest/setup/single-distributed.html>
* the distributed scheduler also gives you access to the dashboard, which has a lot of useful information to diagnose how your system is running. You can also configure a lot about its behaviour, in case you have firewall rules you need to obey. Please see: [How do I schedule a task to update indexes?](https://qa.mythicsoft.com/14733/how-do-i-schedule-a-task-to-update-indexes?show=14733#q14733) here is an example notebook

<https://gist.github.com/volkerh/465925d24accc940f7a0a0b1f5f40f7a#file-map_array_example-ipynb>

map\_array\_example.ipynb

{

"cells": [

{

"cell\_type": "code",

"execution\_count": 1,

"id": "satellite-momentum",

"metadata": {},

"outputs": [],

"source… as long as you write down the hierarchy manually, there’s certainly the possibility to simplify such transitive from implementations with a macro. [i’ve written one here, feel free to take a look.](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=337cce675aa28e99ac030ca783c1c155) going even further one could try to use procedural macros with global state that uses annotations on the…