Using MySQLdb to select into the local file
Nikhil
mnikhil at gmail.com
Fri May 23 14:13:34 EDT 2008
John Nagle wrote:
> Nikhil wrote:
>> I am using the MySQLdb python module. I have a table named 'testing'
>> with few columns, under the 'test' database, what is hosted on a
>> remote mysql server.
>>
>> I want to run the following query to get a comma-separated information
>> from the table
>>
>>
>> LOCK TABLES foo READ;
>> SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
>> FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
>> LINES TERMINATED BY '\n'
>> FROM 'testing'
>> UNLOCK TABLES;
>>
>> ..the query is running fine, but what I am noticing is /tmp/result.txt
>> is getting created locally on a mysqld running machine but not on the
>> client(python program) using the MySQLdb module.
>
> Unfortunately, while there is LOAD DATA LOCAL INFILE, which
> reads a file on the client, there is no SELECT INTO LOCAL OUTFILE.
>
> Actually, you probably want to turn off the FILE privilege
> for your MySQL. That blocks LOAD DATA INFILE and SELECT INTO
> OUTFILE, generally considered a good idea because those commands can
> access arbitrary file names.
>
> Also, if you're still using LOCK TABLES and UNLOCK TABLES,
> read up on InnoDB and transactions.
>
> Typically, you do something like this:
>
> import MySQLdb
> import csv
>
> def writedb(db, filename) :
> try :
> outcsv = csv.writer(filename) # output object for CSV
> cursor = db.cursor()
> cursor.execute("SELECT a,b,a+b FROM testing")
> while True : # do all rows
> row = cursor.fetchone() # get a tuple for one row
> if row is None : # if end of rows
> break # done
> outcsv.writerow(row) # write row in CSV format
> db.commit() # release locks
>
> except MySQLdb.OperationalError, message:
> print "Database trouble: ", message # handle any db problems
> raise # reraise exception
>
>
> hostname="???" # fill in appropriately
> user="???"
> password="???"
> db = MySQLdb.connect(host=hostname, # open database
> user=username, passwd=password, db=databasename)
>
> writedb(db, '/tmp/result.txt') # do it
>
> ===============
>
> Note that this is ASCII-oriented; if you Unicode, you need
> extra params to "connect". Also, the CSV module doesn't do
> Unicode well as yet. Make sure the "outcsv" object
> goes out of scope before you try to read the file, so the
> file gets flushed and closed.
>
> John Nagle
Thanks John. That was a useful tip.
Regards,
Nikhil
More information about the Python-list
mailing list