Why can't you just copy the existing values in the log_file field?

Anthony

On Monday, April 2, 2018 at 2:35:28 PM UTC-4, James McGlynn wrote:
>
> 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