Обсуждение: Deleting BLOBs
I'd like to delete all the image files from a table by issuing an
interactive psql command. Given
CREATE TABLE image (
name text,
rast oid
);
with most tuples having images in rast, wanna do something like
=> select lo_unlink('select rast from image');
Can such a thing be done, and how? I guess I've forgotten the syntax.
Or will an update that sets the oids to null or 0 work?
(pgsql 9.1.2)
Thanks.
If i where you i would try:
select lo_unlink(rest) from image
but i'm never used this function...
Neanderthelle Jones <elle@view.net.au> hat am 12. August 2012 um 12:16
geschrieben:
> I'd like to delete all the image files from a table by issuing an
> interactive psql command. Given
>
> CREATE TABLE image (
> name text,
> rast oid
> );
>
> with most tuples having images in rast, wanna do something like
>
> => select lo_unlink('select rast from image');
>
> Can such a thing be done, and how? I guess I've forgotten the syntax.
>
> Or will an update that sets the oids to null or 0 work?
>
> (pgsql 9.1.2)
>
> Thanks.
>
> -
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
> > select lo_unlink(rest) from image > > but i'm never used this function... i've ...
On Sun, 12 Aug 2012, Neanderthelle Jones wrote:
> I'd like to delete all the image files from a table by issuing an
> interactive psql command. Given
>
> CREATE TABLE image (
> name text,
> rast oid
> );
>
> with most tuples having images in rast, wanna do something like
>
> => select lo_unlink('select rast from image');
>
> Can such a thing be done, and how? I guess I've forgotten the syntax.
>
> Or will an update that sets the oids to null or 0 work?
>
> (pgsql 9.1.2)
One attempt. Is the error mine or PostgreSQL's?
$ for i in $(psql -q -t -U elle -d my_db \
-c "SELECT raster FROM images where raster > 0"); do
echo $i
psql -q -U elle -d my_db -c "SELECT lo_unlink($i)"
done
21234
ERROR: large object 21234 does not exist
21235
ERROR: large object 21235 does not exist
21236
ERROR: large object 21236 does not exist
21237
ERROR: large object 21237 does not exist
21238
ERROR: large object 21238 does not exist
21239
ERROR: large object 21239 does not exist
21240
ERROR: large object 21240 does not exist
21241
ERROR: large object 21241 does not exist
21242
ERROR: large object 21242 does not exist
21243
ERROR: large object 21243 does not exist
etc. etc.
On Mon, 13 Aug 2012, Neanderthelle Jones wrote: > > $ for i in $(psql -q -t -U elle -d my_db \ > -c "SELECT raster FROM images where raster > 0"); do > echo $i > psql -q -U elle -d my_db -c "SELECT lo_unlink($i)" > done "BEGIN; SELECT lo_unlink($i); COMMIT" makes no difference.
Neanderthelle Jones <elle@view.net.au> writes:
> One attempt. Is the error mine or PostgreSQL's?
> $ for i in $(psql -q -t -U elle -d my_db \
> -c "SELECT raster FROM images where raster > 0"); do
> echo $i
> psql -q -U elle -d my_db -c "SELECT lo_unlink($i)"
> done
> 21234
> ERROR: large object 21234 does not exist
> 21235
> ERROR: large object 21235 does not exist
> [etc]
That script looks reasonable enough, if perhaps not too fast. Are you
sure the table actually does reference live large objects?
regards, tom lane
On Sun, 12 Aug 2012, Tom Lane wrote: > Neanderthelle Jones <elle@view.net.au> writes: > > One attempt. Is the error mine or PostgreSQL's? > > > $ for i in $(psql -q -t -U elle -d my_db \ > > -c "SELECT raster FROM images where raster > 0"); do > > echo $i > > psql -q -U elle -d my_db -c "SELECT lo_unlink($i)" > > done > > > 21234 > > ERROR: large object 21234 does not exist > > 21235 > > ERROR: large object 21235 does not exist > > [etc] > > That script looks reasonable enough, if perhaps not too fast. Are you > sure the table actually does reference live large objects? Thanks, Tom. No, because I fumbled a bit, and didn't vacuum. They may have gone, but I don't understand why the oids get echoed in that case. What does "live" mean? Elle
Neanderthelle Jones <elle@view.net.au> writes:
> On Sun, 12 Aug 2012, Tom Lane wrote:
>> That script looks reasonable enough, if perhaps not too fast. Are you
>> sure the table actually does reference live large objects?
> What does "live" mean?
Well, my point is that the OIDs in the table are just numbers. They
might reference large objects, or they might not ... and your results
suggest not.
One way to verify what large objects actually exist is
SELECT DISTINCT loid FROM pg_largeobject;
(Depending on your PG version, you might need to be superuser to do
that.)
regards, tom lane