By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
444,034 Members | 1,325 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 444,034 IT Pros & Developers. It's quick & easy.

Getting binary data out of a postgre database

P: n/a
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:passw ord')
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.

Jul 19 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a
> 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?
--
Regards,

Diez B. Roggisch
Jul 19 '05 #2

P: n/a
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

Jul 19 '05 #3

P: n/a
projecktzero wrote:
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
Jul 19 '05 #4

P: n/a
whew!

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

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

Thanks for the help!

Jul 19 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.