2012-04-21 17 views
1

對於我的項目,我需要連接到多個數據庫並從中獲取信息。我不認爲這將是一個web2py的問題,但它是。我想也許我需要從頭開始重建數據庫,但仍然存在問題。最後,我瀏覽了介紹性的「圖像」教程,並將其更改爲使用備用mysql數據庫。我仍然得到了同樣的錯誤,下面是代碼:在web2py的'圖片博客'上使用簡單的select語句獲取錯誤

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')) 

然後我去管理頁面的「圖像」,並在「控制器」點擊「外殼」鏈接並做了以下內容:(後我去索引頁生成「圖片」:

殼牌

In [1] : print db(images_db.image).select() 
Traceback (most recent call last): 
    File "/home/cody/Downloads/web2py/gluon/contrib/shell.py", line 233, in run 
    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, in expand_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'}> 

現在我不太明白爲什麼我在這裏得到錯誤,一切似乎都是按順序的。我以爲web2py支持多個數據庫?我做錯了嗎?該appadmin工作正常,也許我會編輯它,並得到它產生的代碼錯誤...任何幫助,將不勝感激。

  • 科迪

UPDATE:

我只是嘗試這樣做:

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')) 

控制器/ 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) 

查看/ DEFAULT/INDEX.HTML

{{left_sidebar_enabled,right_sidebar_enabled=False,True}} 
{{extend 'layout.html'}} 


these are the rows: 
{{=rows }} 

再次,非常受這一切混淆。感謝任何幫助。

回答

3

如果要查詢images_db連接,則必須調用images_db()而不是db()。因此,這將是:

images_db(images_db.image).select() 
+0

感謝安東尼,我猜這是一個有點混亂試圖給我正確的答案時,這似乎是如此明顯:d – Codygman 2012-04-22 01:03:00

+0

其實,我花了一段時間來通知問題。我們習慣於看到'db(...)。select()',當我們創建沒有命名爲'db'的db連接時,很容易出現這樣的錯誤。此外,錯誤消息可能會更有幫助 - 最終會在「映像」上獲取KeyError,但通知查詢引用與正在查詢的數據庫連接不同的數據庫會更有用。 – Anthony 2012-04-22 15:47:49