Getting binary data out of a postgre database


P

projecktzero

Well, I've managed to get an image into a postgre database, but now I'm
having trouble getting it out.

#! /usr/bin/env python

from pyPgSQL import PgSQL

def main():
connectdb = PgSQL.connect('server:port:database:username:password')
cur = connectdb.cursor()
sqlStatement = """SELECT image from images where image_id = 1"""
cur.execute(sqlStatement)
rec = cur.fetchone()
# TODO make temp file name include image_id.
# TODO use tempfile module
# TODO clean up old temp files
tempFileName = "1.jpg"
tempFile = open(tempFileName, "w")
tempFile.write(rec[0])
tempFile.close()
cur.close()

print "Content-type: text/html\n\n"
print """"<?xml version="1.0" encoding="windows-1250"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1250" />
<title></title>
</head>

<body>
<img src="1.jpg">
</body>
</html>
"""

if __name__ == '__main__':
main()

Traceback (most recent call last):
File "./dispimage.py", line 39, in ?
main()
File "./dispimage.py", line 16, in main
tempFile.write(rec[0])
TypeError: argument 1 must be string or read-only character buffer, not
instance

So, rec[0] is an instance, but an instance of what? Since I needed to
use the PgSQL.PgBytea method on the image before inserting it into the
database, do I need to use a similar method to undo what PgBytea did to
it, or am I incorrectly writing this binary data? I tried
PgSQL.PgUnQuoteBytea(rec[0]), but that didn't work.

Can anyone show me the TypeError of my ways? Is there a good example
somewhere that shows getting binary data out of a database?

Thanks.
 
Ad

Advertisements

D

Diez B. Roggisch

So, rec[0] is an instance, but an instance of what? Since I needed to
use the PgSQL.PgBytea method on the image before inserting it into the
database, do I need to use a similar method to undo what PgBytea did to
it, or am I incorrectly writing this binary data? I tried
PgSQL.PgUnQuoteBytea(rec[0]), but that didn't work.


What does

print rec[0]

give you?
 
P

projecktzero

Sorry for the late reply. I didn't check the group/list over the
weekend.

Anyway, I added a print rec[0] just after the fetchone. Then I ran it
from the command line, and it spewed a bunch of binary gibberish nearly
locking up Putty.

To me, it seems like it's coming out in the right format, but I'm not
sure what I'm doing wrong. If you have any ideas, I'd really
appreciate it.

Thanks,

Mike
 
D

Diez B. Roggisch

projecktzero said:
Sorry for the late reply. I didn't check the group/list over the
weekend.

Anyway, I added a print rec[0] just after the fetchone. Then I ran it
from the command line, and it spewed a bunch of binary gibberish nearly
locking up Putty.

To me, it seems like it's coming out in the right format, but I'm not
sure what I'm doing wrong. If you have any ideas, I'd really
appreciate it.

What does

print rec[0].__class__

give you?

And what about using

tempFile.write(str(rec[0]))

if print really resulted in the binary data, this might help.

The DB-Api isn't too detailed about binary columns at all - the just
mentioned a Binary() object, and something about buffer objects. I'm not
sure how to ndeal with these - they seem to be mentioned in the
C-Api-Section only.


Sorry that I can't be of more help.
Diez
 
Ad

Advertisements

P

projecktzero

whew!

tempFile.write(str(rec[0])) works!

printing rec[0].__class__ puts out pyPgSQL.PgSQL.PgBytea

Thanks for the help!
 

Top