<?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: Database conversion</title>
    <link>http://cwilliams.textdriven.com/articles/2005/07/08/database-conversion</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Ruby. Rails. Stuff.</description>
    <item>
      <title>Database conversion</title>
      <description>&lt;p&gt;Following on the heels of my earlier entry about db_structure_dump, I&amp;rsquo;ve created another small useful Ruby script.&lt;/p&gt;
&lt;p&gt;As I said before, my production databse is Oracle 10g and so is my own development database - but&amp;nbsp;the development databases of the others helping out are MySQL. Now that I can dump the CREATE TABLE statements for my Oracle databases I need some way to convert back and forth between MySQL and Oracle syntax &amp;ndash; since both aren&amp;rsquo;t really standard. Or at least I need to be able to dump my development oracle DB to SQL and then convert it to MySQL for the others.&lt;/p&gt;
&lt;p&gt;Below is the hack I created that will take an Oracle database&amp;rsquo;s structure (or &amp;nbsp;sqlite, odbc, mssql and mysql)and convert it to standard SQL, then to MySQL syntax(since MySQL can&amp;rsquo;t handle VARCHAR&amp;rsquo;s longer than 255, for intance).&lt;/p&gt;
&lt;p&gt;The code is not generic enough to be useful for everyone, but should give a good start. Watch out if you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don&amp;rsquo;t use ID as your primary key. This is assumed right now, but a smarter script could check for keys.&lt;/li&gt;
&lt;li&gt;Actually use NUMBER in Oracle as a&amp;nbsp;DECIMAL (and want to retain that in MySQL, rather than have it converted to INTEGER).&lt;/li&gt;
&lt;li&gt;Have join tables (since usually you won&amp;rsquo;t use ID as the primary key, you&amp;rsquo;ll have to manually fix the primary key).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;SQLStandardizer&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;type&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;source&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="attribute"&gt;@data_type&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="attribute"&gt;@data&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;type&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;source&lt;/span&gt;
    &lt;span class="ident"&gt;init_substitutions&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;     
    
  &lt;span class="comment"&gt;# Convert data to compatible SQL&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;convert&lt;/span&gt;
    &lt;span class="ident"&gt;replacements&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="attribute"&gt;@subst&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="attribute"&gt;@data_type&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
    &lt;span class="ident"&gt;new_data&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="attribute"&gt;@data&lt;/span&gt;
    &lt;span class="ident"&gt;replacements&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&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;original&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;replacer&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;new_data&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gsub!&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;original&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;replacer&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="ident"&gt;new_data&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;    
  
   &lt;span class="comment"&gt;# Initialize the substitution array&lt;/span&gt;
  &lt;span class="ident"&gt;private&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;init_substitutions&lt;/span&gt;
    &lt;span class="attribute"&gt;@subst&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{}&lt;/span&gt;
    &lt;span class="attribute"&gt;@subst&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;mysql&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{"&lt;/span&gt;&lt;span class="string"&gt;int&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;INTEGER&lt;/span&gt;&lt;span class="punct"&gt;","&lt;/span&gt;&lt;span class="string"&gt;dec&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;DECIMAL&lt;/span&gt;&lt;span class="punct"&gt;"}&lt;/span&gt;
    &lt;span class="attribute"&gt;@subst&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;oracle&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{"&lt;/span&gt;&lt;span class="string"&gt;BFILE&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;BLOB&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;CLOB&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;TEXT&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;DATE&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;DATETIME&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;LONG&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;BIGINT&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;LONG RAW&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;BIGINT&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;NCHAR&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;CHAR&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;NCLOB&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;TEXT&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;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;DECIMAL&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;NVARCHAR2&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;VARCHAR&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;RAW&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;BLOB&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;VARCHAR2&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;VARCHAR&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;DOUBLE PRECISION&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;DECIMAL&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="escape"&gt;\r\n&lt;/span&gt;LOGGING&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="escape"&gt;\r\n&lt;/span&gt;NOCACHE&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="escape"&gt;\r\n&lt;/span&gt;NOPARALLEL&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
 				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt; BYTE&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;"}&lt;/span&gt;
    &lt;span class="attribute"&gt;@subst&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;odbc&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{"&lt;/span&gt;&lt;span class="string"&gt;LONGCHAR&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;BLOB&lt;/span&gt;&lt;span class="punct"&gt;"}&lt;/span&gt;
    &lt;span class="attribute"&gt;@subst&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;sqlite&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{"&lt;/span&gt;&lt;span class="string"&gt;INTEGER(10)&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;INTEGER&lt;/span&gt;&lt;span class="punct"&gt;"}&lt;/span&gt;
    &lt;span class="attribute"&gt;@subst&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;mssql&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{"&lt;/span&gt;&lt;span class="string"&gt;nvarchar&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;VARCHAR&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;nchar&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;CHAR&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;int identity&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;INTEGER&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;ntext&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;TEXT&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;int&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;INTEGER&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;image&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;LONGBLOB&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;
				&lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;money&lt;/span&gt;&lt;span class="punct"&gt;"=&amp;gt;"&lt;/span&gt;&lt;span class="string"&gt;FLOAT&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;DBSpecializer&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;type&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;source&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="attribute"&gt;@data_type&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="attribute"&gt;@data&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;type&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;source&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  
  &lt;span class="comment"&gt;# Right now we can only convert to MySQL&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;convert&lt;/span&gt;
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="attribute"&gt;@data&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="attribute"&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;mysql&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
    &lt;span class="ident"&gt;new_data&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="attribute"&gt;@data&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gsub&lt;/span&gt;&lt;span class="punct"&gt;(/&lt;/span&gt;&lt;span class="regex"&gt;VARCHAR&lt;span class="escape"&gt;\(&lt;/span&gt;(&lt;span class="escape"&gt;\d&lt;/span&gt;+)&lt;span class="escape"&gt;\)&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;/)&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;match&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;length&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="global"&gt;$1&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_i&lt;/span&gt;
      &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;length&lt;/span&gt; &lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;255&lt;/span&gt;
        &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;TEXT&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
      &lt;span class="keyword"&gt;else&lt;/span&gt;
        &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;VARCHAR(&lt;span class="expr"&gt;#{length}&lt;/span&gt;)&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="comment"&gt;# We don't really use decimals&lt;/span&gt;
    &lt;span class="ident"&gt;new_data&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gsub!&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;DECIMAL&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;INTEGER&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
    &lt;span class="comment"&gt;# Make primary keys auto-incremented&lt;/span&gt;
    &lt;span class="ident"&gt;new_data&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gsub!&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt; ID INTEGER NOT NULL&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt; ID INTEGER NOT NULL AUTO_INCREMENT&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
    &lt;span class="comment"&gt;# Set up primary key and initial auto-increment value&lt;/span&gt;
    &lt;span class="comment"&gt;# FIXME What if our primary key is not ID?&lt;/span&gt;
    &lt;span class="ident"&gt;new_data&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;gsub!&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="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;,&lt;span class="escape"&gt;\n&lt;/span&gt; PRIMARY KEY (`id`)&lt;span class="escape"&gt;\n&lt;/span&gt;) AUTO_INCREMENT=1;&lt;/span&gt;&lt;span class="punct"&gt;")&lt;/span&gt;
    &lt;span class="ident"&gt;new_data&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;


&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;__FILE__&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="global"&gt;$0&lt;/span&gt;
  &lt;span class="ident"&gt;from&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;oracle&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;to&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mysql&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;source_file&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;production_structure.sql&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;output_file&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;converted_&lt;span class="expr"&gt;#{source_file}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
  &lt;span class="ident"&gt;source&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;source_file&lt;/span&gt;&lt;span class="punct"&gt;)&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;f&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;readlines&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="comment"&gt;# Convert from oracle to mysql&lt;/span&gt;
  &lt;span class="ident"&gt;standardized&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;SQLStandardizer&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;from&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;source&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;convert&lt;/span&gt;
  &lt;span class="ident"&gt;converted&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;DBSpecializer&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;to&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;standardized&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;convert&lt;/span&gt;
  &lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;output_file&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;w&lt;/span&gt;&lt;span class="punct"&gt;')&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;f&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="ident"&gt;f&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;converted&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;</description>
      <pubDate>Fri, 08 Jul 2005 15:33:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:94b4ef2e31d3a71adf10565d572b2595</guid>
      <author>cwilliams</author>
      <link>http://cwilliams.textdriven.com/articles/2005/07/08/database-conversion</link>
      <category>Rails</category>
      <category>Ruby</category>
      <category>Programming</category>
      <category>ruby</category>
      <category>Rails</category>
      <category>database</category>
      <category>converions</category>
      <category>oracle</category>
      <category>MySQL</category>
    </item>
  </channel>
</rss>
