2

我正在做一个项目,该项目需要我导入一个已经存在的数据库并在 Web2py 中使用它的数据。我已经能够通过将 DAL URI 更改为:

db = DAL('mysql://root:password@localhost/database_name',pool_size=1,check_reserved=['all'])

它可以很好地创建我所有的 web2py 定义的字段,并且可以与它们交互,但是我无法访问之前已经在数据库中的任何数据。我尝试运行 web2py 脚本 extract_mysql_models.py,这是导入数据的受支持方式,但我得到的只是:

legacy_db = DAL('mysql://root:password@localhost/localhost/database_name')

它只是创建了另一个 dal 对象。尝试通过 legacy_db 访问任何内容只会提供与尝试通过 db 获取内容相同的选项。有没有人这样做过?有小费吗?

4

2 回答 2

2

我有同样的问题。我就是这样做的。

  1. 从旧数据库中转储它

    mysqldump --user USERNAME --password=PASSWORD dbname > backup.sql
    
  2. 将备份文件导入新的 mysql 服务器

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

然后它与旧数据库相同。我遇到的问题是从 pythonanywhere UI 设置数据库创建了一个与我的旧数据库不同的数据库。所以如果我没记错的话,你也可以让 web2py 首先创建数据库表,然后最后执行第 2 步。反正我就是这样做的......如果我没记错的话;)希望它可以帮助你。干杯

于 2013-07-23T05:52:23.300 回答
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)
于 2013-11-01T15:53:42.727 回答