2013-07-22 51 views
2

我的工作要求我輸入一個已經存在的數據庫,並在web2py中使用的數據的項目。我已經能夠通過改變DAL的URI鏈接到數據庫:如何將現有的MySQL數據庫導入到web2py中?

db = DAL('mysql://root:[email protected]/database_name',pool_size=1,check_reserved=['all']) 

,它創造我的所有的web2py定義字段的蠻好的,它可以與他們進行互動,但我不能訪問任何的之前已經在數據庫中的數據。我試圖運行web2py的腳本extract_mysql_models.py,這是導入數據的支持方式,但我得到的返回信息:

legacy_db = DAL('mysql://root:[email protected]/localhost/database_name') 

剛剛創建另一個DAL對象。嘗試通過legacy_db訪問任何內容只會給出與嘗試通過db獲取內容相同的選項。有沒有人做過這個?有小費嗎?

回答

2

我有同樣的問題。我就是這樣做的。

  1. 從舊的數據庫爲之傾倒

    mysqldump --user USERNAME --password=PASSWORD dbname > backup.sql 
    
  2. 進口backupfile新的MySQL服務器

    mysql -h mysql.server -u USERNAME -p 'DBNAME' < backup.sql 
    
  3. 添加添加DAL連接到新的MySQL服務器。

然後它與舊的db相同。我遇到的問題是從pythonany設置數據庫UI創建了一個與我的舊數據庫不相同的數據庫。所以如果我沒有記錯,你也可以讓web2py首先創建數據庫表,然後最後執行第2步。多數民衆贊成我是如何做反正...如果我記得是對的;)希望它可以幫助你。乾杯

+0

這是我失蹤了,這些表在數據庫中定義,但他們間沒有」在web2py中定義。我很困惑,因爲'extract_mysql_models.py'只輸出一行,但它應該是每個表的完整定義。感謝幫助指出:)。 對於其他任何人,如果'extract_mysql_models.py'不能正常工作,請嘗試自己定義表。 – mswjackso

0

我有同樣的問題,下面的函數,appadmin.py創建自動創建表定義

get_db(): 
    import re 
    datyp = dict(
    bit='boolean', tinyint='boolean', 
    smallint='integer', mediumint='integer', int='integer', bigint='bigint', 
    decimal='decimal', double='double', float='double', 
    char='password', varchar='string', 
    longtext='list:string', mediumtext='text', text='text', tinytext='text', 
    enum='json', 
    timestamp='datetime', datetime='datetime', date='date', time='time', 
    year='integer', 
    tinyblob='blob', blob='blob', mediumblob='blob', longblob='blob', 
    binary='blob', varbinary='blob' 
    # upload reference list:string list:integer list:reference 
    # json big-id big-reference 
    ) 
    tdat = [] 
    tbls = [t[0] for t in db.executesql('SHOW TABLES;')] 
    for tbl in tbls: 
     cols = [k.strip() for k in db.executesql(
      'SHOW CREATE TABLE `' + tbl + '`;')[0][1].split('\n')] 
     fname = OrderedDict() 
     for col in cols: 
      if col.startswith('KEY'): 
       continue 
      coln = re.findall('`([^`]*)`', col) 
      if (col.startswith('`')): 
       st = col.index(' ') + 1 
       typ = col[st:col.index('(' if '(' in col else 
         (' ' if ' ' in col[st:] else ','), st)] 
       ft = datyp[typ] 
       if (ft == 'string'): 
        st = col.index('(', st) + 1 
        ft = "'" + ft + "', length=" + col[st:col.index(')', st)] 
       elif (ft == 'decimal'): 
        st = col.index('(', st) 
        ft = "'" + ft + col[st:col.index(')', st) + 1] + "'" 
       else: 
        ft = "'" + ft + "'" 
       if (not "DEFAULT NULL" in col) and ("'" in col): 
        st = col.index("DEFAULT '") + len("DEFAULT '") 
        ft += ', default=' + col[st:col.index("'", st)] 
       if 'NOT NULL' in col: 
        ft += ', required=True' 
       fname.update({coln[0]: ft}) 
       continue 
      if (len(coln) == 2 and col.startswith('UNIQUE KEY')): 
       fname[coln[1]] += ', unique=True' 
       continue 
      if (len(coln) == 4): 
       sval = fname[coln[1]] 
       if 'integer' in sval: 
        sval = sval.replace('integer', 'reference db.' + coln[2]) 
       elif 'bigint' in sval: 
        sval = sval.replace('bigint', 
             'big-reference db.' + coln[2]) 
       fname[coln[1]] = sval 
       if ('ON DELETE ' in col) and (not 'CASCADE' in col): 
        st = col.index("ON DELETE ") + len("ON DELETE ") 
        sval = ', ondelete="' + col[st:col.index(" ON", st)] + '"' 
        fname[coln[1]] += sval 
     colstr = ["db.define_table('" + tbl + "',"] 
     for key, val in fname.items(): 
      if (key == 'id'): 
       continue 
      colstr.append("Field('" + key + "', " + val + "),") 
     colstr.append('migrate=False)') 
     tdat.append(colstr) 
    response.view = 'default/index.html' 
    return dict(msg=tdat) 
相關問題