<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Mysql on notes</title><link>https://unionsep.dev/tags/mysql/</link><description>Recent content in Mysql on notes</description><generator>Hugo -- 0.161.1</generator><language>en</language><lastBuildDate>Tue, 07 Mar 2017 19:26:32 +0900</lastBuildDate><atom:link href="https://unionsep.dev/tags/mysql/index.xml" rel="self" type="application/rss+xml"/><item><title>続 select結果をcsvでファイル出力</title><link>https://unionsep.dev/posts/2017/03/07/192632/</link><pubDate>Tue, 07 Mar 2017 19:26:32 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2017/03/07/192632/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://ogimage.blog.st-hatena.com/10328537792370092437/10328749687214380007/1486437386"
      alt=""
      loading="lazy"
    >

  <a href="http://unionsep.hatenablog.com/entry/2017/02/07/114941" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">select結果をcsvでファイル出力</div>
      <div class="cite-card__description">
        自分では結構前から便利に使ってるんだけど、意外に重宝されることが最近ありました それがこれ select * from hoge into outfile…
      </div>

    <div class="cite-card__site">Webメモ</div>
  </a>
</aside>

<p>先月、mysqlの <code>into outfile</code> でレコードをCSVファイルにサクッと取ってた記事を書きました<br>
で、これは知ってるんだけど、今回はこれじゃダメなんだよな〜ってときに、どうしていたか思い出したので、記事書く気になりました</p>
<p>というのも、</p>
<ol>
<li><code>into outfile</code> を使うと <code>access denied</code> になる場合も権限によってはあるね</li>
<li>mysqlがsshトンネルの先にあって、その先のsshは許可されてないの・・・とか</li>
<li>ファイルにしたら巨大過ぎて、そんなの置くスペースないぜ！とか</li>
</ol>
<p>過去を思い返すと、3. のパターンはあったな〜という思い出です<br>
確かあれはサーバフルリプレイスしてたときに、あのvmが・・・</p>
<p>まぁ、というわけなんですが、手順はこんな感じ</p>
<ol>
<li><code>mysql</code> コマンドに <code>-e</code> つけてSQLを投げる</li>
<li>
<ol>
<li>はタブ区切りで出力されるから、 <code>sed</code> でタブをカンマに変換</li>
</ol>
</li>
<li>csvファイルにリダイレクトする</li>
</ol>
<p>1 . のSQLですが、文字列系はダブルクオーテーションで囲う</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#66d9ef">select</span>
</span></span><span style="display:flex;"><span>  concat(<span style="color:#e6db74">&#39;&#34;&#39;</span>, hoge, <span style="color:#e6db74">&#39;&#34;&#39;</span>) <span style="color:#66d9ef">as</span> hoge,
</span></span><span style="display:flex;"><span>  hige <span style="color:#66d9ef">as</span> hige,
</span></span><span style="display:flex;"><span>  concat(<span style="color:#e6db74">&#39;&#34;&#39;</span>, huga, <span style="color:#e6db74">&#39;&#34;&#39;</span>) <span style="color:#66d9ef">as</span> huga
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">from</span> hogehoge
</span></span></code></pre></div><p>ワンライナーで書けるSQLだったら <code>-e</code> に続けて書いてもいいけど、 <code>concat</code> とか使ってたらそうも行かないので、SQLファイルにしておく<br>
で、これでファイルを <code>cat</code> してクエリをmysqlに流し込んで、ファイルにリダイレクトしておく<br>
この時、mysqlはタブ区切りに出力してくれるみたいなので、なんとなく拡張子を <code>tsv</code> にしてます</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>mysql -uroot hohoidb -e <span style="color:#e6db74">&#34;`cat hogehoge.sql`&#34;</span> &gt; ./hoge.tsv
</span></span></code></pre></div><p>2 . 3 . <code>sed</code> でタブをカンマに変換してリダイレクト</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>sed -e <span style="color:#e6db74">&#39;s/\t/,/g&#39;</span> ./hoge.tsv &gt; hoge.csv
</span></span></code></pre></div><hr>
<p>てな感じでヌルっと出してます<br>
まぁ、だいたいSQL用意してこんな感じでバーンとしてます</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>mysql -uroot hohoidb -e <span style="color:#e6db74">&#34;`cat hogehoge.sql`&#34;</span> | sed -e <span style="color:#e6db74">&#39;s/\t/,/g&#39;</span> &gt; hogehoge.csv
</span></span></code></pre></div><hr>
<p>あ、前回書き忘れたけど、csvをmysqlにインポートするときはこんなSQL使ってます</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#66d9ef">LOAD</span> <span style="color:#66d9ef">DATA</span> <span style="color:#66d9ef">LOCAL</span> INFILE <span style="color:#e6db74">&#39;/home/ore/hogehoge.csv&#39;</span> <span style="color:#66d9ef">INTO</span> <span style="color:#66d9ef">TABLE</span> hogehoge FIELDS TERMINATED <span style="color:#66d9ef">BY</span> <span style="color:#e6db74">&#39;,&#39;</span> ENCLOSED <span style="color:#66d9ef">BY</span> <span style="color:#e6db74">&#39;&#34;&#39;</span>
</span></span></code></pre></div><hr>
<p>自分が完全に管理してるDBだったら、<code>ALTER</code> やっちゃえ！とかも思うんですが、「別チームんとこだしなー」「申請とかなー」とか思う時、エンジニアだったらあるはず！<br>
そんなときに、サックリ自己解決したいときに使ってます<br>
遅せークエリがボトルネックになってるんだけど、ローカルにデータ欲しいわーって思ったときとかかなぁ</p>
<p>今のところ、この2つの手法でデータが取れなかったことはないかなぁ</p>
<hr>
<p>こういうのって、結構レガシーな手法で、知ってても自慢できるようなことじゃないんだけど、知らない人は知らない感じなのかなぁ<br>
僕は結構頻繁に使うのですが、知らない人は、思いつかない限り使わないのかなぁと思ったりしてます<br>
これらの気にいってるとこは、 <code>select</code> しか投げてないで！ってとこ<br>
流石に <code>select</code> で壊れないっしょっていう安心感があるｗ<br>
ブログ書いてるの、わりと会社の人にバレた気配がするので、役立ってくれたらうれしいなぁ〜</p>
]]></content></item><item><title>select結果をcsvでファイル出力</title><link>https://unionsep.dev/posts/2017/02/07/114941/</link><pubDate>Tue, 07 Feb 2017 11:49:41 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2017/02/07/114941/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>自分では結構前から便利に使ってるんだけど、意外に重宝されることが最近ありました</p>
<p>それがこれ</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#66d9ef">select</span> <span style="color:#f92672">*</span> <span style="color:#66d9ef">from</span> hoge
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">into</span> outfile <span style="color:#e6db74">&#39;/tmp/hoge.csv&#39;</span>
</span></span><span style="display:flex;"><span>fields terminated <span style="color:#66d9ef">by</span> <span style="color:#e6db74">&#39;,&#39;</span>
</span></span><span style="display:flex;"><span>optionally enclosed <span style="color:#66d9ef">by</span> <span style="color:#e6db74">&#39;&#34;&#39;</span>
</span></span></code></pre></div><p>私の使いみちとしては、</p>
<ul>
<li>障害対応なんかで、多分このレコードがおかしいんだけど、100%自信がないときに試したい</li>
<li>二日酔いのときに、絶対間違えられないクエリを流すとき</li>
<li>ローカルじゃない別の環境で起きてる不具合のデータをサクッととってきたいとき</li>
<li>単にダンプが面倒なとき</li>
<li>シャーディングしてるDBで、他のDBへの参照権限がない場合、grantするの大げさやなって思ったときにファイルに出してシェルとかawkでコネコネするとき</li>
</ul>
<p><code>/tmp</code> か <code>/var/tmp</code> 配下にcsvファイルを落として、ファイル自体の消し忘れを防止することを意識的にしてたりする</p>
<p>ま、mysqlの実行ユーザーにパーミッションがないところには落とせないんですけど</p>
<p>時と場合によっては <code>fields terminated by</code> の指定を変えて、タブ区切りとかスペース区切りにしてシェルとかawk、perlで使いやすい形にしたりする</p>
<p>前のプロジェクトの方針？として、「直せるんだったらなにしてもいい」っていうなんともファンキーな空気で、まぁ立ち上げ近くからいたからかもしれませんが、、クエリ打つときは <code>begin</code> <code>commit</code> <code>rollback</code> してって先輩に口酸っぱく言われてました</p>
<p>ただ、家でたら鍵かけたかな？って思うぐらい、一時記憶装置の容量が少ない私は不安になってしまってこういう若干過度なテクニックがわりと発達したのかも</p>
<p>まぁ、もう大体忘れちゃいましたけど・・・</p>
<p>最近はMySQLばっかのプロジェクトに関わることが多いのですが、OracleとかPostgresqlとかにも同様の機能があるのかなぁ</p>
]]></content></item></channel></rss>