The problem is that this:
print db(images_db.image).select()
should be
print images_db(images_db.image).select()
because you cannot have a query involving a table sent to database that
does not have the table.
You can also check with
>>> 'images_db' in db.tables()
False
>>> 'images_db' in images_db.tables()
True
On Saturday, 21 April 2012 16:59:41 UTC-5, Cody Goodman wrote:
>
> For my project, I need to connect to multiple databases and get
> information from them. I didn't think this would be a problem with web2py,
> but it was. I thought maybe I need to rebuild the db from scratch, but
> still had problems. Finally, I went through the introductory 'images'
> tutorial and changed it to use an alternate mysql database. I still got the
> same errors, below is the code:
>
> *db.py*
> db = DAL("mysql://root:@localhost/web2py")
> images_db = DAL("mysql://root:@localhost/images_test")
>
>
> images_db.define_table('image',
> Field('title', unique=True),
> Field('file', 'upload'),
> format = '%(title)s')
>
>
> images_db.define_table('comment',
> Field('image_id', images_db.image),
> Field('author'),
> Field('email'),
> Field('body', 'text'))
>
>
>
>
> Then I went to the admin page for 'images' and clicked the 'shell' link
> under 'controllers' and did the following: (after I went to the index page
> to generate the 'images':
>
> In [1] : print db(images_db.image).select()
> Traceback (most recent call last):
> File "/home/cody/Downloads/web2py/gluon/contrib/shell.py", line 233, inrun
> exec compiled in statement_module.__dict__
> File "<string>", line 1, in <module>
> File "/home/cody/Downloads/web2py/gluon/dal.py", line 7577, in select
> fields = adapter.expand_all(fields, adapter.tables(self.query))
> File "/home/cody/Downloads/web2py/gluon/dal.py", line 1172, inexpand_all
> for field in self.db[table]:
> File "/home/cody/Downloads/web2py/gluon/dal.py", line 6337, in__getitem__
> return dict.__getitem__(self, str(key))
> KeyError: 'image'
>
>
> In [2] : print images_db.has_key('image')
> True
>
>
> In [3] : print images_db
> <DAL {'_migrate_enabled': True, '_lastsql': "SET
> sql_mode='NO_BACKSLASH_ESCAPES';", '_db_codec': 'UTF-8', '_timings': [('SET
> FOREIGN_KEY_CHECKS=1;', 0.00017380714416503906), ("SET
> sql_mode='NO_BACKSLASH_ESCAPES';", 0.00016808509826660156)],
> '_fake_migrate': False, '_dbname': 'mysql', '_request_tenant':
> 'request_tenant', '_adapter': <gluon.dal.MySQLAdapter object at 0x2b84750
> >, '_tables': ['image', 'comment'], '_pending_references': {},
> '_fake_migrate_all': False, 'check_reserved': None, '_uri':
> 'mysql://root:@localhost/images_test', 'comment': <Table {'body': <gluon.
> dal.Field object at 0x2b844d0>, 'ALL': <gluon.dal.SQLALL object at
> 0x2b84090>, '_fields': ['id', 'image_id', 'author', 'email', 'body'],
> '_sequence_name': 'comment_sequence', '_plural': 'Comments', 'author': <
> gluon.dal.Field object at 0x2b84e10>, '_referenced_by': [], '_format':
> None, '_db': <DAL {...}>, '_dbt':
> 'applications/images/databases/e1e448013737cddc822e303fe20f8bec_comment.table'
> , 'email': <gluon.dal.Field object at 0x2b84490>, '_trigger_name':
> 'comment_sequence', 'image_id': <gluon.dal.Field object at 0x2b84050>,
> '_actual': True, '_singular': 'Comment', '_tablename': 'comment',
> '_common_filter': None, 'virtualfields': [], '_id': <gluon.dal.Field
> object at 0x2b84110>, 'id': <gluon.dal.Field object at 0x2b84110>,
> '_loggername': 'applications/images/databases/sql.log'}>, 'image': <Table
> {'ALL': <gluon.dal.SQLALL object at 0x2b84850>, '_fields': ['id', 'title',
> 'file'], '_sequence_name': 'image_sequence', 'file': <gluon.dal.Field
> object at 0x2b847d0>, '_plural': 'Images', 'title': <gluon.dal.Field
> object at 0x2b84610>, '_referenced_by': [('comment', 'image_id')],
> '_format': '%(title)s', '_db': <DAL {...}>, '_dbt':
> 'applications/images/databases/e1e448013737cddc822e303fe20f8bec_image.table'
> , '_trigger_name': 'image_sequence', '_loggername':
> 'applications/images/databases/sql.log', '_actual': True, '_tablename':
> 'image', '_common_filter': None, 'virtualfields': [], '_id': <gluon.dal.
> Field object at 0x2b848d0>, 'id': <gluon.dal.Field object at 0x2b848d0>,
> '_singular': 'Image'}>, '_referee_name': '%(table)s', '_migrate': True,
> '_pool_size': 0, '_common_fields': [], '_uri_hash':
> 'e1e448013737cddc822e303fe20f8bec'}>
>
>
> Now I don't quite understand why I am getting errors here, everything
> appears to be in order. I thought web2py supported multiple databases? Am I
> doing it wrong? The appadmin works fine, perhaps I'll edit it and get it to
> raise an error with the code it's generating... any help would be
> appreciated.
>
> - Cody
>
>
> UPDATE:
>
> I just tried this:
>
> *MODELS/DB.PY*
> db = DAL("mysql://root:@localhost/web2py")
>
> images_db = DAL("mysql://root:@localhost/images_test")
>
>
> images_db.define_table('image',
> Field('title', unique=True),
> Field('file', 'upload'),
> format = '%(title)s')
>
>
> images_db.define_table('comment',
> Field('image_id', images_db.image),
> Field('author'),
> Field('email'),
> Field('body', 'text'))
>
>
> *CONTROLLERS/DEFAULT.PY*
> def index():
> """
> example action using the internationalization operator T and flash
> rendered by views/default/index.html or views/generic.html
> """
> if images_db.has_key('image'):
> rows = db(images_db.image).select()
> else:
> rows = 'nope'
> #rows = dir(images_db)
> return dict(rows=rows)
>
>
> *VIEWS/DEFAULT/INDEX.HTML*
> {{left_sidebar_enabled,right_sidebar_enabled=False,True}}
> {{extend 'layout.html'}}
>
>
> these are the rows:
> {{=rows }}
>
> Again, very confused by all of this. Appreciate any help.
>