CSV から null をロード

Posted by muchag | MySQL,phpMyAdmin | 2018-04-28 (土) 10:01:31

【環境】
MySQL: 5.7.18
phpMyAdmin: 4.7.6
経緯
phpMyAdmin

CSV からデータをロードしようとしたら

エラー
#1292 – Incorrect datetime value: ‘null’ for column ‘hoge’ at row 1

というエラーが出た。

CSV の中身を見ると、当該カラムの値は “null” となっている。

CLI

MySQL の CLI から入れようとしたら Warning が出た。

気持ち悪いので、なんとかしてみようと思った。

データ型

ちなみに対象カラムのデータ型は DATETIME。

手法1

LOAD DATA LOCAL INFILE '/path/to/csv_file.csv' INTO TABLE hoge FIELDS TERMINATED BY ',' ENCLOSED BY '"' SET deleted = nullif(deleted, '0000-00-00 00:00:00');

どこで見たか忘れてしまったけど
こういうやり方があるらしい。

以前試したときは上手くいった。

複数カラム対象

ただ今回は、複数カラムが対象で


LOAD DATA LOCAL INFILE '/path/to/csv_file.csv' INTO TABLE hoge FIELDS TERMINATED BY ',' ENCLOSED BY '"' SET registered = nullif(deleted, '0000-00-00 00:00:00'), deleted = nullif(deleted, '0000-00-00 00:00:00');

このように書いてみたけど、上手く行かなかった。

その後

すぐ諦めたので、何が悪いのか、そもそもこの書き方が正しいのかすら不明。

手法2

null のカラムの CSV 値を “\N” とする手法。

これもどこかに書いてあったのを見かけた記憶があったので試してみたところ、
なんと、上手くいった♪

Excel のセルに \N とそのまま記述して
CSV では、”\N” となるように吐き出したところ
OK だった。

MySQL,phpMyAdmin | 2018-04-28 (土) 10:01:31 |

phpDocumentor

Posted by muchag | PHP | 2018-04-11 (水) 15:52:58

個人で開発をしていると、こういうチームワーク的な手法に手が回らない。
実感が湧かないからね。。。

公式?:phpDocumentor

アノテーション
@property

公式?:@property
メンバ変数の型宣言をできる。

php では、メンバ変数を宣言する際に、型宣言を伴わない。
そのせいで phpStrom では、警告が出るらしい。

User.php

class User
{
    private $name;

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }
}

この User クラスをメンバ変数 $leader へ代入すると
$leader が何者か不明なために、User クラス内メソッドを利用する際に警告となるらしい。

そこで、下記のように @property アノテーションで定義してやることで
理解してもらえるそうな。

ちなみに、複数管理するメンバ変数には、User[] という他言語タイプで伝えるとよいらしい。


/**
 * Class Group
 *
 * @property User $leader
 * @property User[] $leaders <- array ではなく User[]
 */
class Group
{
    private $leader;
    private $leaders = [];
}
@method

公式?:@method
findX のようなマジックメソッド利用時に用いる。
※マジックメソッドは、そんなメソッドは存在しないんだけど
メソッド名からフレームワーク側が解析して、処理してくれるメソッド?


/**
 * Class SampleModel
 *
 * @method array findById($id, $fields = null)
 */
class SampleModel extends AppModel
{

このように明記してやることができる。

@uses, @used-by

メソッド名を動的に生成する場合に用いる。
要は、当該メソッドがどこからも呼ばれていないと思われるのを避ける。

公式?:@uses & @used-by


class Hoge
{
    /**
     * @uses addUser(), addAdmin()
     */
    public function addMember($user, $user_type)
    {
        $method = sprintf('add%s', $user_type);
        $this->{$method}($user); // $user_type に合ったメソッドを呼ぶ
    }

    /**
     * @used-by addMember
     */
    private function addUser($user)
    {
    }

    /**
     * @used-by addMember
     */
    private function addAdmin($user)
    {
    }
}
@uses

@uses の呼び出し元に設定する。

@used-by

@uses の呼び出し先に設定する。

参考サイト

バシャログ。:PhpStorm の静的解析機能をさらに活用するための3つのアノテーション(2015-12-07)
→@property, @method, @uses について非常にわかりやすかった

PHP | 2018-04-11 (水) 15:52:58 |