<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>digital matter &#187; mysql</title>
	<atom:link href="http://blog.loadlimits.info/tag/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.loadlimits.info</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 06 Feb 2012 13:27:58 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>MySQL Workbenchからschema.ymlを生成する</title>
		<link>http://blog.loadlimits.info/2011/02/mysql-workbench%e3%81%8b%e3%82%89schema-yml%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b/</link>
		<comments>http://blog.loadlimits.info/2011/02/mysql-workbench%e3%81%8b%e3%82%89schema-yml%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 20:18:26 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2011/02/mysql-workbench%e3%81%8b%e3%82%89schema-yml%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b/</guid>
		<description><![CDATA[MySQL Workbenchからsymfony+Doctrine用のschema.ymlを書き出せないかなぁとつぶやいたら@hidenorigotoさんに教えていただいたので試してみました。 http://twitter.com/#!/hidenorigoto/status/38153994970988544 MySQL Workbench schema exporter MySQL Workbench schema exporterは、MySQL WorkbenchプラグインのMySQL Workbench Doctrine Pluginにインスパイアを受けて開発されたようです。 が、こちらのプラグインはすでにメンテされていないようです。 開発終了した理由がぞろぞろ書いてありますが、要約すると「LUAが…」ってことみたいです。 MySQL Workbench schema exporterはPHPで書かれています。MySQL Workbenchのmwbファイルを読み込んでパース、フォーマッタを指定してそれぞれの形式を書き出すようです。 ちなみにmwbファイルはZIP圧縮されたXMLです。あと、SQLite3のデータが入ってました。 注意点としてPHP 5.3以降でないと実行できません… いつものdebian環境では5.2を使ってるので、Windows版の5.3をダウンロードしてインストールしました。 まずはexampleディレクトリに移動します。 C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example&#62;php -v PHP 5.3.5 (cli) (built: Jan 5 2011 20:36:18) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies example/data/にtest.mwbがあり、サンプルではこのファイルを使います。 ちなみにサンプルのEER(Enhanced Entity-Relationship) diagramはこんな感じです。 [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL Workbenchからsymfony+Doctrine用のschema.ymlを書き出せないかなぁとつぶやいたら<a href="http://twitter.com/#!/hidenorigoto" target="_blank">@hidenorigotoさん</a>に教えていただいたので試してみました。     <br /><a href="http://twitter.com/#!/hidenorigoto/status/38153994970988544" target="_blank">http://twitter.com/#!/hidenorigoto/status/38153994970988544</a></p>
<p><a href="https://github.com/johmue/mysql-workbench-schema-exporter" target="_blank">MySQL Workbench schema exporter</a></p>
<p>MySQL Workbench schema exporterは、MySQL Workbenchプラグインの<a href="http://code.google.com/p/mysql-workbench-doctrine-plugin/" target="_blank">MySQL Workbench Doctrine Plugin</a>にインスパイアを受けて開発されたようです。     <br />が、こちらのプラグインはすでにメンテされていないようです。</p>
<p>開発終了した理由がぞろぞろ書いてありますが、要約すると「LUAが…」ってことみたいです。</p>
<p>MySQL Workbench schema exporterはPHPで書かれています。MySQL Workbenchのmwbファイルを読み込んでパース、フォーマッタを指定してそれぞれの形式を書き出すようです。    <br />ちなみにmwbファイルはZIP圧縮されたXMLです。あと、SQLite3のデータが入ってました。</p>
<p>注意点としてPHP 5.3以降でないと実行できません…    <br />いつものdebian環境では5.2を使ってるので、Windows版の5.3をダウンロードしてインストールしました。</p>
<p>まずはexampleディレクトリに移動します。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example&gt;php -v
PHP 5.3.5 (cli) (built: Jan  5 2011 20:36:18)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies</pre>
</div>
<p>example/data/にtest.mwbがあり、サンプルではこのファイルを使います。</p>
<p>ちなみにサンプルのEER(Enhanced Entity-Relationship) diagramはこんな感じです。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2011/02/test.png"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="test.mwb" src="http://blog.loadlimits.info/wp-content/uploads/2011/02/test_thumb.png" width="423" height="326" /></a></p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example&gt;php .\doctrine1.yaml.php
&lt;textarea cols="100" rows="50"&gt;Bureau:
  tableName: mydb.bureaus
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    room:
      type: string(45)
  indexes:
    testIndex:
      fields: [room]
      type: unique
  options:
    charset: utf8
    type: InnoDB

Email:
  actAs:
    timestampable:
  tableName: mydb.emails
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    email:
      type: string(255)
    users_id:
      type: integer(4)
      primary: true
      notnull: true
  relations:
    User:
      class: User
      local: users_id
      foreign: id
      foreignAlias: Emails
      onDelete: no action
      onUpdate: no action
  indexes:
    fk_Emails_Users:
      fields: [users_id]
  options:
    charset: utf8
    type: InnoDB

User:
  actAs:
    timestampable:
  tableName: mydb.users
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    name:
      type: string(255)
  options:
    charset: utf8
    type: InnoDB

UsersBureaus:
  tableName: mydb.users_bureaus
  columns:
    users_id:
      type: integer(4)
      primary: true
      notnull: true
    bureaus_id:
      type: integer(4)
      primary: true
      notnull: true
  relations:
    User:
      class: User
      local: users_id
      foreign: id
      foreignAlias: UsersBureauss
      onDelete: no action
      onUpdate: no action
    Bureau:
      class: Bureau
      local: bureaus_id
      foreign: id
      foreignAlias: UsersBureauss
      onDelete: no action
      onUpdate: no action
  indexes:
    fk_users_bureaus_bureaus1:
      fields: [bureaus_id]
  options:
    charset: utf8
    type: InnoDB

Testtable:
  tableName: mydb2.testtable
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
  options:
    charset: utf8
    type: InnoDB
&lt;/textarea&gt;&lt;br&gt;&lt;br&gt;1 MB used&lt;br&gt;0.055 sec needed</pre>
</div>
<p>というわけで、リレーションやインデックスなども書きだされるようです。<br />
  <br />HTMLのタグはdoctrine1.yaml.phpの中に書いてあるので、CLIから使うときは適当に外してください。</p>
<p>timestampableなどのビヘイビアに関しては、コメント欄に書くことで出力できるようです。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>{d:actAs}
  actAs:
    timestampable:
{/d:actAs}</pre>
</div>
<p>この仕様はちょっと微妙な気が…<br />
  <br />created_atとupdated_atがあったらtimestampable付けるとかの方が楽だなぁ、と。 </p>
<p>作っちゃった後の全テーブルにコメント指定して回るのはちょっと辛いので。</p>
<p>サーバにPHP 5.3が入っているなら、symfony taskでmwbからschema.ymlの生成と、ActAsの追加をやってしまうのがいいかな、と思いました。</p>
<p>うーん、個人的にはMySQL Workbench上で完結したいから、プラグインの方が便利な気はするんですけどねぇ。LUAとは言わなくてもPythonスクリプティング対応しているようなので、Pythonに書き直すとか…</p>
<p>この後、60テーブルほどのファイルを変換してみましたが、問題なく実行できました。<br />
  </p>
<h3>追記(2011/02/19)</h3>
<p>注意点がいくつかあります。<br />
  <br />というか、致命的かも。</p>
<p>１．NOT NULLのchar型にDEFAULT値&#8221;を入れるとNULLに変換される</p>
<p>これはDoctrineのbuild &#8211;sqlがおかしいかな…</p>
<p>column_name:<br />
  <br />&#160; type: char(3)</p>
<p>&#160; notnull: true</p>
<p>&#160; default: &#8221;</p>
<p>column_name char(3) DEFAULT NULL NOT NULLとかいう矛盾を持ったクエリが生成されます。<br />
  <br />ちなみにvarcharは大丈夫です。</p>
<p>default: &#8221;の行は削除しましょう。</p>
<p>２．DECIMALやFLOATの最大桁数と少数点の値が逆になる</p>
<p>ひどい。<br />
  <br />例えばMySQL WorkbenchでDECIMAL(15,4)と指定したカラムがDECIMAL(4,15)と書き出されます。</p>
<p>column_name:<br />
  <br />&#160; type: decimal(4,15)</p>
<p>&#160; notnull: true</p>
<p>&#160; default: &#8217;0.0000&#8242;</p>
<p>もちろん、ちゃんとMySQL Workbenchからクエリのエクスポートをしたときは15,4になります。<br />
  <br />置換で何とか…</p>
<p>うーん、やっぱりMySQL WorkbenchでDBをあらかじめ作成しておいてから→doctrine:build-schema→schema.yml修正が妥当かなぁ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2011/02/mysql-workbench%e3%81%8b%e3%82%89schema-yml%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPのDateTimeの結果が-0001-11-30 00:00:00になる現象について</title>
		<link>http://blog.loadlimits.info/2010/05/php%e3%81%aedatetime%e3%81%ae%e7%b5%90%e6%9e%9c%e3%81%8c-0001-11-30-000000%e3%81%ab%e3%81%aa%e3%82%8b%e7%8f%be%e8%b1%a1%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/</link>
		<comments>http://blog.loadlimits.info/2010/05/php%e3%81%aedatetime%e3%81%ae%e7%b5%90%e6%9e%9c%e3%81%8c-0001-11-30-000000%e3%81%ab%e3%81%aa%e3%82%8b%e7%8f%be%e8%b1%a1%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/#comments</comments>
		<pubDate>Fri, 14 May 2010 10:04:33 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[疑問]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2010/05/php%e3%81%aedatetime%e3%81%ae%e7%b5%90%e6%9e%9c%e3%81%8c-0001-11-30-000000%e3%81%ab%e3%81%aa%e3%82%8b%e7%8f%be%e8%b1%a1%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/</guid>
		<description><![CDATA[mySQLなどで、日時を0000-00-00 00:00:00としてデータベースに格納しておくことがありますが、これを読み込んでそのままPHPのDateTimeオブジェクトに渡すと、出力が-0001-11-30 00:00:00になってしまいます。 $a = new DateTime('0000-00-00 00:00:00'); echo $a-&#62;format('Y-m-d H:i:s'); // Output: -0001-11-30 00:00:00 PHP :: Bug #42971 :: DataTime::format(): not well formated data &#8217;0000-00-00 00:00:00&#8242; で、これはバグではないと言われているので、どういうことかと考えてみると、0000-00-00は存在しない0月0日を指定しているので、0月は繰り下がって-1年12月0日、さらに0日も繰り下がって-1年11月30日、となるわけですね。 データベースとPHPの文化の違い、というところでしょうか。 ちなみにDateTime型、コンストラクタにNULLを渡すと現在時刻のインスタンスが生成されるので、データベースの値をNULLにしておくと、現在時刻になってしまいます。うーん…symfonyのDoctrineでNULL判定したい場合はどうすればいいんだ… $row-&#62;getDateTimeObject('deleted_at') みたいなことがやりたいのですが。 sfDoctrineRecordも $type = $this-&#62;getTable()-&#62;getTypeOf($dateFieldName); if ($type == 'date' &#124;&#124; $type == 'timestamp') { return new DateTime($this-&#62;get($dateFieldName)); } こうなってるからオーバーライドするしかないのかな。]]></description>
			<content:encoded><![CDATA[<p>mySQLなどで、日時を0000-00-00 00:00:00としてデータベースに格納しておくことがありますが、これを読み込んでそのままPHPのDateTimeオブジェクトに渡すと、出力が-0001-11-30 00:00:00になってしまいます。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>$a = new DateTime('0000-00-00 00:00:00');
echo $a-&gt;format('Y-m-d H:i:s');
// Output: -0001-11-30 00:00:00
</pre>
</div>
<p><a href="http://bugs.php.net/bug.php?id=42971" target="_blank">PHP :: Bug #42971 :: DataTime::format(): not well formated data &#8217;0000-00-00 00:00:00&#8242;</a></p>
<p>で、これはバグではないと言われているので、どういうことかと考えてみると、0000-00-00は存在しない0月0日を指定しているので、0月は繰り下がって-1年12月0日、さらに0日も繰り下がって-1年11月30日、となるわけですね。</p>
<p>データベースとPHPの文化の違い、というところでしょうか。</p>
<p>ちなみにDateTime型、コンストラクタにNULLを渡すと現在時刻のインスタンスが生成されるので、データベースの値をNULLにしておくと、現在時刻になってしまいます。うーん…symfonyのDoctrineでNULL判定したい場合はどうすればいいんだ…</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>$row-&gt;getDateTimeObject('deleted_at')</pre>
</div>
<p>みたいなことがやりたいのですが。</p>
<p>sfDoctrineRecordも</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>    $type = $this-&gt;getTable()-&gt;getTypeOf($dateFieldName);
    if ($type == 'date' || $type == 'timestamp')
    {
      return new DateTime($this-&gt;get($dateFieldName));
    }
</pre>
</div>
</p>
<p>こうなってるからオーバーライドするしかないのかな。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2010/05/php%e3%81%aedatetime%e3%81%ae%e7%b5%90%e6%9e%9c%e3%81%8c-0001-11-30-000000%e3%81%ab%e3%81%aa%e3%82%8b%e7%8f%be%e8%b1%a1%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

