Hello, 

I am using web2py on heroku. I have two installed applications using two 
different postgres databases. I am trying to copy all the data from one of 
the databases to the other. One of the tables has an upload field which 
uses s3 as the filesystem. 

I don't want to duplicate the files, I just want the new database to know 
where the files are and be able to download them from s3. I tried just 
passing whatever came from db1 to db2 and that didn't error, but then when 
I download the file it is empty (they are gzips of csv files). I also tried 
passing a file handle that I got from s3 using boto, but that complained 
and I also thought that it might duplicate the file on s3, which I don't 
want. 

What is a good way to do this?


Here is my table definition for application and db 1:

from datetime import datetime
import fs.s3fs, os
myfs = 
fs.s3fs.S3FS(os.environ['AWS_S3_BUCKET_NAME'],os.environ['AWS_S3_BUCKET_PREFIX'],os.environ['AWS_S3_KEY'],
 
os.environ['AWS_S3_SECRET'])

db.define_table('log_files',
Field('das_id'),
Field('device_id'),
Field('das_id_dev_id'),
Field('log_filename'),
Field('log_file', 'upload'),
Field('date_added','datetime'),
)
db.log_files.log_file.uploadfs=myfs

And here is my table definition for app and db 2 (it's basically the same)

from datetime import datetime
import fs.s3fs, os
myfs = 
fs.s3fs.S3FS(os.environ['AWS_S3_BUCKET_NAME'],os.environ['AWS_S3_BUCKET_PREFIX'],os.environ['AWS_S3_KEY'],
 
os.environ['AWS_S3_SECRET'])

db.define_table('log_files',
Field('das_id' ,type='string'),
Field('device_id' ,type='string'),
Field('das_id_dev_id' ,type='string'),
Field('log_filename' ,type='string'),
Field('log_file' ,type='upload'),
Field('date_added' ,type='datetime'),
)
db.log_files.log_file.uploadfs=myfs


And here is the python script that I've been playing around with to try and 
get what I want:

import os, psycopg2, psycopg2.extras, boto
from psycopg2.extensions import AsIs

table_name="log_files"
params=dict(table_name=AsIs(table_name))

# Open the connections to each database
conn_old = psycopg2.connect(os.environ['HEROKU_POSTGRESQL_ONYX_URL'])
conn_new = psycopg2.connect(os.environ['HEROKU_POSTGRESQL_BROWN_URL'])

## Create Curstors for each database
cur_old = conn_old.cursor(cursor_factory = psycopg2.extras.DictCursor)
cur_new = conn_new.cursor()


## Select files from the source db and fetch them. 
cur_old.execute("SELECT * FROM %(table_name)s WHERE id = 4451744", params)

bucket=connect_to_s3()

for rec_old in cur_old:
columns = rec_old.keys()
values = rec_old
insert_statement = ('INSERT INTO %(table_name)s ( das_id, device_id, 
das_id_dev_id, log_filename, log_file, date_added )'
'VALUES ( %(das_id)s, %(device_id)s, %(das_id_dev_id)s, %(log_filename)s, 
%(log_file)s, %(date_added)s )'
)

params=dict(
table_name = AsIs(table_name),
das_id = values['das_id'],
device_id = values['device_id'],
das_id_dev_id = values['das_id_dev_id'],
log_filename = values['log_filename'],
date_added = values['date_added'],

## Help!
log_file         = get_key(bucket, values['log_file']),
)

try:
cur_new.execute(insert_statement, params)
conn_new.commit()

except psycopg2.IntegrityError:
conn_new.rollback()

#close new connection
cur_new.close()
conn_new.close()

# close old connection
cur_old.close()
conn_old.close()



-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to