<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Late to the Party: Rails, db_structure_dump, and Oracle</title>
    <link>http://cwilliams.textdriven.com/articles/2005/06/30/rails-db_structure_dump-and-oracle</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Ruby. Rails. Stuff.</description>
    <item>
      <title>Rails, db_structure_dump, and Oracle</title>
      <description>&lt;p&gt;I use Ruby on Rails at work with an Oracle 10g database. The problem is that I have a couple new people who are supposed to begin helping with the project and would like to set up development databases. When I was using MySQL this was easy, I used the db_structure_dump task in rake and gave them the output file. &lt;/p&gt;
&lt;p&gt;I tried to do the same with Oracle, but apparently the task and adapters aren&amp;rsquo;t set up for this. So after some looking around the web I came up with my own solution &amp;ndash; to implement structure_dump in the oci_adapter. So if anyone needs this, here&amp;rsquo;s the quick and very dirty code. It could use some loving and cleaning before it gets submitted as a patch.&lt;/p&gt;
&lt;p&gt;Add the following method to the OciAdapter class in &lt;em&gt;active_record/connection_adapters/oci_adapter.rb&lt;/em&gt;:&lt;/p&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;notextile&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;structure_dump&lt;/span&gt;
  &lt;span class="ident"&gt;select_all&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;select table_name from user_tables&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;inject&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;structure&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;table&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="ident"&gt;string&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;CREATE TABLE &lt;span class="expr"&gt;#{table.to_a.first.last}&lt;/span&gt; (&lt;span class="escape"&gt;\n&lt;/span&gt; &lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="ident"&gt;array&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;select_all&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;select column_name, data_type, data_length, data_precision,
       data_scale, data_default, nullable from all_tab_columns where table_name =
       '&lt;span class="expr"&gt;#{table.to_a.first.last}&lt;/span&gt;' order by column_id&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
    
    &lt;span class="ident"&gt;array&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;collect!&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;hash&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;tmp&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{hash['column_name']}&lt;/span&gt; &lt;span class="expr"&gt;#{hash['data_type']}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;	      
      &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;hash&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;data_type&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; &lt;span class="punct"&gt;=='&lt;/span&gt;&lt;span class="string"&gt;NUMBER&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="keyword"&gt;and&lt;/span&gt; &lt;span class="punct"&gt;!&lt;/span&gt;&lt;span class="ident"&gt;hash&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;data_precision&lt;/span&gt;&lt;span class="punct"&gt;'].&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt;
        &lt;span class="ident"&gt;tmp&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;(&lt;span class="expr"&gt;#{hash['data_precision'].to_i}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="ident"&gt;tmp&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;,&lt;span class="expr"&gt;#{hash['data_scale'].to_i}&lt;/span&gt;)&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="punct"&gt;!&lt;/span&gt;&lt;span class="ident"&gt;hash&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;data_scale&lt;/span&gt;&lt;span class="punct"&gt;'].&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt;
        &lt;span class="ident"&gt;tmp&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;)&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
      &lt;span class="keyword"&gt;elsif&lt;/span&gt; &lt;span class="ident"&gt;hash&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;data_type&lt;/span&gt;&lt;span class="punct"&gt;'].&lt;/span&gt;&lt;span class="ident"&gt;include?&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;CHAR&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
        &lt;span class="ident"&gt;tmp&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;(&lt;span class="expr"&gt;#{hash['data_length'].to_i}&lt;/span&gt;)&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;  
      &lt;span class="keyword"&gt;end&lt;/span&gt;	      
      &lt;span class="ident"&gt;tmp&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt; DEFAULT &lt;span class="expr"&gt;#{hash['data_default']}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="punct"&gt;!&lt;/span&gt;&lt;span class="ident"&gt;hash&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;data_default&lt;/span&gt;&lt;span class="punct"&gt;'].&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt;
      &lt;span class="ident"&gt;tmp&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt; NOT NULL&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;hash&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;nullable&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; &lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;=&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;N&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
      &lt;span class="ident"&gt;tmp&lt;/span&gt;	      
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="ident"&gt;array&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;uniq!&lt;/span&gt;
    &lt;span class="ident"&gt;array&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;delete_if&lt;/span&gt; &lt;span class="punct"&gt;{|&lt;/span&gt;&lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="ident"&gt;string&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;array&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;,&lt;span class="escape"&gt;\n&lt;/span&gt; &lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
    &lt;span class="ident"&gt;string&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;);&lt;span class="escape"&gt;\n\n&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="ident"&gt;structure&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;string&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&amp;hellip;And add &amp;ldquo;oci&amp;rdquo; to the case statement in the &lt;em&gt;Rakefile&lt;/em&gt;:&lt;/p&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;notextile&gt;&lt;span class="ident"&gt;desc&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Dump the database structure to a SQL file&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:db_structure_dump&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:environment&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;abcs&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;configurations&lt;/span&gt;
  &lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="ident"&gt;abcs&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="punct"&gt;][&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;adapter&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]&lt;/span&gt; 
    &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;mysql&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;oci&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
      &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;establish_connection&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;abcs&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 30 Jun 2005 19:56:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:b6d2377c25b47a1e4f1cea75879f054c</guid>
      <author>cwilliams</author>
      <link>http://cwilliams.textdriven.com/articles/2005/06/30/rails-db_structure_dump-and-oracle</link>
      <category>Programming</category>
      <category>Ruby</category>
      <category>Rails</category>
      <category>oracle</category>
      <category>Rails</category>
      <category>db</category>
    </item>
    <item>
      <title>"Rails, db_structure_dump, and Oracle" by Chris</title>
      <description>It's been submitted as a patch now. Hopefully we'll see it in 1.0</description>
      <pubDate>Tue, 12 Jul 2005 12:53:23 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:08c557aa2a8acf2aced4fe0f48d235a4</guid>
      <link>http://cwilliams.textdriven.com/articles/2005/06/30/rails-db_structure_dump-and-oracle#comment-61</link>
    </item>
    <item>
      <title>"Rails, db_structure_dump, and Oracle" by Zsombor</title>
      <description>Good work! How about submitting it as a a patch to rails trunk?  </description>
      <pubDate>Tue, 05 Jul 2005 07:59:05 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:07a573bff6f3a82460f7146dcf5f0b3c</guid>
      <link>http://cwilliams.textdriven.com/articles/2005/06/30/rails-db_structure_dump-and-oracle#comment-60</link>
    </item>
    <item>
      <title>"Rails, db_structure_dump, and Oracle" by mcd</title>
      <description>Good work.

I'm in a learning path with Oracle and have been tracking Rails as a MVC framework so you post is
a great tutorial for me w.r.t. Oracle SQL strategies
AND a clue just how powerful Rails might be with such functionality embedded in the DB connector code.

The Ruby syntax is just starting to become parsable
for me. It looks clean and highly effective for a programmer that has mastered the tools.

I'll be back for more insights and inspiration. Keep the code-based posts coming.



</description>
      <pubDate>Fri, 01 Jul 2005 16:14:29 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:78e293401184d89ebcacc33416bd073e</guid>
      <link>http://cwilliams.textdriven.com/articles/2005/06/30/rails-db_structure_dump-and-oracle#comment-59</link>
    </item>
  </channel>
</rss>
