<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<link rel="self" href="/Atom/" />
	<id>http://billmill.org/</id>
	<title>My Name Rhymes</title>
	<subtitle>Bill Mill blogs irregularly</subtitle>
	<updated>2007-08-17T00:05:00Z</updated>
	<author>
		<name>Bill Mill</name>
		<email>bill.mill@gmail.com</email>
		<uri>http://billmill.org/</uri>
	</author>
	<link href="http://billmill.org/" />
	<entry>
		<title>MySQL Partial Dump</title>
		<link href="http://billmill.org/mysqldump_n.html" />	
		<id>http://billmill.org/mysqldump_n.html</id>
		<updated>2007-08-17T00:05:00Z</updated>
		<summary type="html">At work, I'm trying to bring our testing from its current ad-hoc state into 
something more useful. Priority #1 at the moment is making what limited 
test suite we have into a practical, repeatable test of our main code 
library.&lt;p&gt;
To do so, however, I need to create script to import a useful subset of the 
data from our nine gigabyte MySQL production database into a local 
database.  Unfortunately, mysqldump seems not to support the export of only 
N rows from a database table, and neither does there seem to be a standard 
way to do so. In fact, there seems to be no standard way to &lt;a 
href="http://forums.mysql.com/read.php?20,159999,159999"&gt;automatically 
generate  insert queries&lt;/a&gt;, so it's not even possible to hack it with 
OUTFILE tricks.&lt;p&gt;
Indeed, a quick look look at the mysqldump &lt;a 
href="http://mysql.bkbits.net:8080/mysql-5.2/client/mysqldump.c?PAGE=anno&amp;REV=%2b"&gt;source 
code&lt;/a&gt; shows that it just constructs a query of the form: "SELECT * FROM 
&lt;em&gt;table&lt;/em&gt; [WHERE &lt;em&gt;condition&lt;/em&gt;] [ORDER BY &lt;em&gt;field&lt;/em&gt;]":&lt;p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;dynstr_append_checked(&lt;span style="font-weight: bold"&gt;&amp;amp;&lt;/span&gt;query_string, 
    &lt;span style="color: #bb8844"&gt;&amp;quot;SELECT /*!40001 SQL_NO_CACHE */ * FROM &amp;quot;&lt;/span&gt;);
dynstr_append_checked(&lt;span style="font-weight: bold"&gt;&amp;amp;&lt;/span&gt;query_string, result_table);

&lt;span style="font-weight: bold"&gt;if&lt;/span&gt; (where)
{
  &lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
  dynstr_append_checked(&lt;span style="font-weight: bold"&gt;&amp;amp;&lt;/span&gt;query_string, &lt;span style="color: #bb8844"&gt;&amp;quot; WHERE &amp;quot;&lt;/span&gt;);
  dynstr_append_checked(&lt;span style="font-weight: bold"&gt;&amp;amp;&lt;/span&gt;query_string, where);
}
&lt;span style="font-weight: bold"&gt;if&lt;/span&gt; (order_by)
{
  &lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
  dynstr_append_checked(&lt;span style="font-weight: bold"&gt;&amp;amp;&lt;/span&gt;query_string, &lt;span style="color: #bb8844"&gt;&amp;quot; ORDER BY &amp;quot;&lt;/span&gt;);
  dynstr_append_checked(&lt;span style="font-weight: bold"&gt;&amp;amp;&lt;/span&gt;query_string, order_by);
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
And then pieces together an insert string manually:&lt;p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;while&lt;/span&gt; ((row&lt;span style="font-weight: bold"&gt;=&lt;/span&gt; mysql_fetch_row(res)))
{
&lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;for&lt;/span&gt; (i&lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;; i &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; mysql_num_fields(res); i&lt;span style="font-weight: bold"&gt;++&lt;/span&gt;)
  {
    &lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; (row[i])
    {
      &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; (&lt;span style="font-weight: bold"&gt;!&lt;/span&gt;IS_NUM_FIELD(field))
      {
        &lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
        unescape(md_result_file, row[i], length);
        &lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
      }
      &lt;span style="font-weight: bold"&gt;else&lt;/span&gt;
      {
        &lt;span style="color: #999988; font-style: italic"&gt;/* change any strings (&amp;quot;inf&amp;quot;, &amp;quot;-inf&amp;quot;, &amp;quot;nan&amp;quot;) into NULL */&lt;/span&gt;
        &lt;span style="color: #445588; font-weight: bold"&gt;char&lt;/span&gt; &lt;span style="font-weight: bold"&gt;*&lt;/span&gt;ptr&lt;span style="font-weight: bold"&gt;=&lt;/span&gt; row[i];
        &lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;else&lt;/span&gt; &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; (my_isalpha(charset_info, &lt;span style="font-weight: bold"&gt;*&lt;/span&gt;ptr) &lt;span style="font-weight: bold"&gt;||&lt;/span&gt;
                 (&lt;span style="font-weight: bold"&gt;*&lt;/span&gt;ptr &lt;span style="font-weight: bold"&gt;==&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;#39;-&amp;#39;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&amp;amp;&amp;amp;&lt;/span&gt; my_isalpha(charset_info, ptr[&lt;span style="color: #009999"&gt;1&lt;/span&gt;])))
          fputs(&lt;span style="color: #bb8844"&gt;&amp;quot;NULL&amp;quot;&lt;/span&gt;, md_result_file);
        &lt;span style="font-weight: bold"&gt;else&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;if&lt;/span&gt; (field&lt;span style="font-weight: bold"&gt;-&amp;gt;&lt;/span&gt;type &lt;span style="font-weight: bold"&gt;==&lt;/span&gt; MYSQL_TYPE_DECIMAL)
        {
          &lt;span style="color: #999988; font-style: italic"&gt;/* add &amp;quot; signs around */&lt;/span&gt;
          fputc(&lt;span style="color: #bb8844"&gt;&amp;#39;\&amp;#39;&amp;#39;&lt;/span&gt;, md_result_file);
          fputs(ptr, md_result_file);
          fputc(&lt;span style="color: #bb8844"&gt;&amp;#39;\&amp;#39;&amp;#39;&lt;/span&gt;, md_result_file);
        }
        &lt;span style="font-weight: bold"&gt;else&lt;/span&gt;
          fputs(ptr, md_result_file);
      }
    }
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
So, rather than deal with hacking the rather baroque C (in a proprietary 
source control that I've never used, no less) to add another option to 
limit output rows, I threw together a little python function that uses &lt;a 
href="http://sourceforge.net/projects/mysql-python"&gt;MySQLdb&lt;/a&gt; to do what 
I want:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;get_n_rows retrieves n rows from a given table on MySQLdb connection conn&lt;/span&gt;

&lt;span style="color: #bb8844"&gt;conn:  open MySQLdb connection object&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;table: string; name of the table which we are generating queries for&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;n:     int; number of rows to output from table&lt;/span&gt;

&lt;span style="color: #bb8844"&gt;Legal kwargs:&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    reverse: bool; whether to return rows in reverse order (requires idCol)&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    idCol:   string; results will be sorted on this column if reverse is &lt;/span&gt;
&lt;span style="color: #bb8844"&gt;             True&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    where:   string; provides the &amp;quot;where&amp;quot; clause of the select query&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;             NOTE: escape this text yourself! use connection.escape() .&lt;/span&gt;

&lt;span style="color: #bb8844"&gt;Released under WTFPL (http://sam.zoy.org/wtfpl/) - use this code as you &lt;/span&gt;
&lt;span style="color: #bb8844"&gt;wish. Note that it&amp;#39;s not tested at all, and certainly won&amp;#39;t handle blob &lt;/span&gt;
&lt;span style="color: #bb8844"&gt;fields. That said, it worked for my purposes today.&lt;/span&gt;

&lt;span style="color: #bb8844"&gt;bill.mill@gmail.com 8/17/07&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;get_n_rows&lt;/span&gt;(conn, table, n, &lt;span style="font-weight: bold"&gt;**&lt;/span&gt;kwargs):
    cur &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; conn&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;cursor()

    &lt;span style="color: #999988; font-style: italic"&gt;#TODO: copy mysqldump&amp;#39;s table escaping function&lt;/span&gt;
    sql &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;select * from `%s` &amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;%&lt;/span&gt; (table)
    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;where&amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; kwargs:
        sql &lt;span style="font-weight: bold"&gt;+=&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;where %s &amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;%&lt;/span&gt; (kwargs[&lt;span style="color: #bb8844"&gt;&amp;quot;where&amp;quot;&lt;/span&gt;])
    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;reverse&amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; kwargs &lt;span style="font-weight: bold"&gt;and&lt;/span&gt; kwargs[&lt;span style="color: #bb8844"&gt;&amp;quot;reverse&amp;quot;&lt;/span&gt;]:
        sql &lt;span style="font-weight: bold"&gt;+=&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;order by `%s` desc &amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;%&lt;/span&gt; (kwargs[&lt;span style="color: #bb8844"&gt;&amp;quot;idCol&amp;quot;&lt;/span&gt;])
    sql &lt;span style="font-weight: bold"&gt;+=&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;limit %s;&amp;quot;&lt;/span&gt;
    cur&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;execute(sql, (n, ))

    i &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;
    row &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; cur&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;fetchone()
    insert_stmts &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; [] 
    &lt;span style="font-weight: bold"&gt;while&lt;/span&gt; row &lt;span style="font-weight: bold"&gt;and&lt;/span&gt; i &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; n:
        i &lt;span style="font-weight: bold"&gt;+=&lt;/span&gt; &lt;span style="color: #009999"&gt;1&lt;/span&gt;
        &lt;span style="color: #999988; font-style: italic"&gt;#note that the MySQLdb source suggests that conn.literal is &lt;/span&gt;
        &lt;span style="color: #999988; font-style: italic"&gt;# private; I see no problem with using it, as it just loads the &lt;/span&gt;
        &lt;span style="color: #999988; font-style: italic"&gt;# default escaping functions. Caveat Emptor.&lt;/span&gt;
        strow &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;, &amp;quot;&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;join([conn&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;literal(o) &lt;span style="font-weight: bold"&gt;for&lt;/span&gt; o &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; row])
        insert_stmts&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;append(&lt;span style="color: #bb8844"&gt;&amp;quot;(%s)&amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;%&lt;/span&gt; (strow))
        row &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; cur&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;fetchone()

    cur&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;close()
    
    &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;-------- INSERT DATA FOR TABLE %(table)s -----------&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    &lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    LOCK TABLES `%(table)s` WRITE;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    DELETE FROM `%(table)s`;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    INSERT INTO `%(table)s` VALUES %(sql)s;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    UNLOCK TABLES;&lt;/span&gt;

&lt;span style="color: #bb8844"&gt;-------- END INSERT DATA FOR TABLE %(table)s -----------&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;%&lt;/span&gt; {&lt;span style="color: #bb8844"&gt;&amp;quot;table&amp;quot;&lt;/span&gt;: table, &lt;span style="color: #bb8844"&gt;&amp;quot;sql&amp;quot;&lt;/span&gt;: &lt;span style="color: #bb8844"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;join(insert_stmts)}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
On a side note, the MySQLdb docs are somewhat hard to track down; I found 
them after some effort &lt;a 
href="http://mysql-python.sourceforge.net/MySQLdb.html"&gt;here&lt;/a&gt;.
</summary>
		<content type="html">At work, I'm trying to bring our testing from its current ad-hoc state into 
something more useful. Priority #1 at the moment is making what limited 
test suite we have into a practical, repeatable test of our main code 
library.&lt;p&gt;
To do so, however, I need to create script to import a useful subset of the 
data from our nine gigabyte MySQL production database into a local 
database.  Unfortunately, mysqldump seems not to support the export of only 
N rows from a database table, and neither does there seem to be a standard 
way to do so. In fact, there seems to be no standard way to &lt;a 
href="http://forums.mysql.com/read.php?20,159999,159999"&gt;automatically 
generate  insert queries&lt;/a&gt;, so it's not even possible to hack it with 
OUTFILE tricks.&lt;p&gt;
Indeed, a quick look look at the mysqldump &lt;a 
href="http://mysql.bkbits.net:8080/mysql-5.2/client/mysqldump.c?PAGE=anno&amp;REV=%2b"&gt;source 
code&lt;/a&gt; shows that it just constructs a query of the form: "SELECT * FROM 
&lt;em&gt;table&lt;/em&gt; [WHERE &lt;em&gt;condition&lt;/em&gt;] [ORDER BY &lt;em&gt;field&lt;/em&gt;]":&lt;p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;dynstr_append_checked(&lt;span style="font-weight: bold"&gt;&amp;amp;&lt;/span&gt;query_string, 
    &lt;span style="color: #bb8844"&gt;&amp;quot;SELECT /*!40001 SQL_NO_CACHE */ * FROM &amp;quot;&lt;/span&gt;);
dynstr_append_checked(&lt;span style="font-weight: bold"&gt;&amp;amp;&lt;/span&gt;query_string, result_table);

&lt;span style="font-weight: bold"&gt;if&lt;/span&gt; (where)
{
  &lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
  dynstr_append_checked(&lt;span style="font-weight: bold"&gt;&amp;amp;&lt;/span&gt;query_string, &lt;span style="color: #bb8844"&gt;&amp;quot; WHERE &amp;quot;&lt;/span&gt;);
  dynstr_append_checked(&lt;span style="font-weight: bold"&gt;&amp;amp;&lt;/span&gt;query_string, where);
}
&lt;span style="font-weight: bold"&gt;if&lt;/span&gt; (order_by)
{
  &lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
  dynstr_append_checked(&lt;span style="font-weight: bold"&gt;&amp;amp;&lt;/span&gt;query_string, &lt;span style="color: #bb8844"&gt;&amp;quot; ORDER BY &amp;quot;&lt;/span&gt;);
  dynstr_append_checked(&lt;span style="font-weight: bold"&gt;&amp;amp;&lt;/span&gt;query_string, order_by);
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
And then pieces together an insert string manually:&lt;p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;while&lt;/span&gt; ((row&lt;span style="font-weight: bold"&gt;=&lt;/span&gt; mysql_fetch_row(res)))
{
&lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
  &lt;span style="font-weight: bold"&gt;for&lt;/span&gt; (i&lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;; i &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; mysql_num_fields(res); i&lt;span style="font-weight: bold"&gt;++&lt;/span&gt;)
  {
    &lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; (row[i])
    {
      &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; (&lt;span style="font-weight: bold"&gt;!&lt;/span&gt;IS_NUM_FIELD(field))
      {
        &lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
        unescape(md_result_file, row[i], length);
        &lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
      }
      &lt;span style="font-weight: bold"&gt;else&lt;/span&gt;
      {
        &lt;span style="color: #999988; font-style: italic"&gt;/* change any strings (&amp;quot;inf&amp;quot;, &amp;quot;-inf&amp;quot;, &amp;quot;nan&amp;quot;) into NULL */&lt;/span&gt;
        &lt;span style="color: #445588; font-weight: bold"&gt;char&lt;/span&gt; &lt;span style="font-weight: bold"&gt;*&lt;/span&gt;ptr&lt;span style="font-weight: bold"&gt;=&lt;/span&gt; row[i];
        &lt;span style="color: #999988; font-style: italic"&gt;/* snip */&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;else&lt;/span&gt; &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; (my_isalpha(charset_info, &lt;span style="font-weight: bold"&gt;*&lt;/span&gt;ptr) &lt;span style="font-weight: bold"&gt;||&lt;/span&gt;
                 (&lt;span style="font-weight: bold"&gt;*&lt;/span&gt;ptr &lt;span style="font-weight: bold"&gt;==&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;#39;-&amp;#39;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&amp;amp;&amp;amp;&lt;/span&gt; my_isalpha(charset_info, ptr[&lt;span style="color: #009999"&gt;1&lt;/span&gt;])))
          fputs(&lt;span style="color: #bb8844"&gt;&amp;quot;NULL&amp;quot;&lt;/span&gt;, md_result_file);
        &lt;span style="font-weight: bold"&gt;else&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;if&lt;/span&gt; (field&lt;span style="font-weight: bold"&gt;-&amp;gt;&lt;/span&gt;type &lt;span style="font-weight: bold"&gt;==&lt;/span&gt; MYSQL_TYPE_DECIMAL)
        {
          &lt;span style="color: #999988; font-style: italic"&gt;/* add &amp;quot; signs around */&lt;/span&gt;
          fputc(&lt;span style="color: #bb8844"&gt;&amp;#39;\&amp;#39;&amp;#39;&lt;/span&gt;, md_result_file);
          fputs(ptr, md_result_file);
          fputc(&lt;span style="color: #bb8844"&gt;&amp;#39;\&amp;#39;&amp;#39;&lt;/span&gt;, md_result_file);
        }
        &lt;span style="font-weight: bold"&gt;else&lt;/span&gt;
          fputs(ptr, md_result_file);
      }
    }
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
So, rather than deal with hacking the rather baroque C (in a proprietary 
source control that I've never used, no less) to add another option to 
limit output rows, I threw together a little python function that uses &lt;a 
href="http://sourceforge.net/projects/mysql-python"&gt;MySQLdb&lt;/a&gt; to do what 
I want:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;get_n_rows retrieves n rows from a given table on MySQLdb connection conn&lt;/span&gt;

&lt;span style="color: #bb8844"&gt;conn:  open MySQLdb connection object&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;table: string; name of the table which we are generating queries for&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;n:     int; number of rows to output from table&lt;/span&gt;

&lt;span style="color: #bb8844"&gt;Legal kwargs:&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    reverse: bool; whether to return rows in reverse order (requires idCol)&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    idCol:   string; results will be sorted on this column if reverse is &lt;/span&gt;
&lt;span style="color: #bb8844"&gt;             True&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    where:   string; provides the &amp;quot;where&amp;quot; clause of the select query&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;             NOTE: escape this text yourself! use connection.escape() .&lt;/span&gt;

&lt;span style="color: #bb8844"&gt;Released under WTFPL (http://sam.zoy.org/wtfpl/) - use this code as you &lt;/span&gt;
&lt;span style="color: #bb8844"&gt;wish. Note that it&amp;#39;s not tested at all, and certainly won&amp;#39;t handle blob &lt;/span&gt;
&lt;span style="color: #bb8844"&gt;fields. That said, it worked for my purposes today.&lt;/span&gt;

&lt;span style="color: #bb8844"&gt;bill.mill@gmail.com 8/17/07&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;get_n_rows&lt;/span&gt;(conn, table, n, &lt;span style="font-weight: bold"&gt;**&lt;/span&gt;kwargs):
    cur &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; conn&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;cursor()

    &lt;span style="color: #999988; font-style: italic"&gt;#TODO: copy mysqldump&amp;#39;s table escaping function&lt;/span&gt;
    sql &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;select * from `%s` &amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;%&lt;/span&gt; (table)
    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;where&amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; kwargs:
        sql &lt;span style="font-weight: bold"&gt;+=&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;where %s &amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;%&lt;/span&gt; (kwargs[&lt;span style="color: #bb8844"&gt;&amp;quot;where&amp;quot;&lt;/span&gt;])
    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;reverse&amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; kwargs &lt;span style="font-weight: bold"&gt;and&lt;/span&gt; kwargs[&lt;span style="color: #bb8844"&gt;&amp;quot;reverse&amp;quot;&lt;/span&gt;]:
        sql &lt;span style="font-weight: bold"&gt;+=&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;order by `%s` desc &amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;%&lt;/span&gt; (kwargs[&lt;span style="color: #bb8844"&gt;&amp;quot;idCol&amp;quot;&lt;/span&gt;])
    sql &lt;span style="font-weight: bold"&gt;+=&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;limit %s;&amp;quot;&lt;/span&gt;
    cur&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;execute(sql, (n, ))

    i &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;
    row &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; cur&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;fetchone()
    insert_stmts &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; [] 
    &lt;span style="font-weight: bold"&gt;while&lt;/span&gt; row &lt;span style="font-weight: bold"&gt;and&lt;/span&gt; i &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; n:
        i &lt;span style="font-weight: bold"&gt;+=&lt;/span&gt; &lt;span style="color: #009999"&gt;1&lt;/span&gt;
        &lt;span style="color: #999988; font-style: italic"&gt;#note that the MySQLdb source suggests that conn.literal is &lt;/span&gt;
        &lt;span style="color: #999988; font-style: italic"&gt;# private; I see no problem with using it, as it just loads the &lt;/span&gt;
        &lt;span style="color: #999988; font-style: italic"&gt;# default escaping functions. Caveat Emptor.&lt;/span&gt;
        strow &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;, &amp;quot;&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;join([conn&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;literal(o) &lt;span style="font-weight: bold"&gt;for&lt;/span&gt; o &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; row])
        insert_stmts&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;append(&lt;span style="color: #bb8844"&gt;&amp;quot;(%s)&amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;%&lt;/span&gt; (strow))
        row &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; cur&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;fetchone()

    cur&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;close()
    
    &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;-------- INSERT DATA FOR TABLE %(table)s -----------&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    &lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    LOCK TABLES `%(table)s` WRITE;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    DELETE FROM `%(table)s`;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    INSERT INTO `%(table)s` VALUES %(sql)s;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;    UNLOCK TABLES;&lt;/span&gt;

&lt;span style="color: #bb8844"&gt;-------- END INSERT DATA FOR TABLE %(table)s -----------&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;%&lt;/span&gt; {&lt;span style="color: #bb8844"&gt;&amp;quot;table&amp;quot;&lt;/span&gt;: table, &lt;span style="color: #bb8844"&gt;&amp;quot;sql&amp;quot;&lt;/span&gt;: &lt;span style="color: #bb8844"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;join(insert_stmts)}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
On a side note, the MySQLdb docs are somewhat hard to track down; I found 
them after some effort &lt;a 
href="http://mysql-python.sourceforge.net/MySQLdb.html"&gt;here&lt;/a&gt;.
</content>
	</entry>
</feed>
