我正在开发一个项目,要求我导入一个已经存在的数据库并在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获取内容相同的选项。有没有人这样做过?有什么提示吗?
答案 0 :(得分:2)
我遇到了同样的问题。这就是我的做法。
从旧数据库中转储
mysqldump --user USERNAME --password=PASSWORD dbname > backup.sql
将备份文件导入新的mysql服务器
mysql -h mysql.server -u USERNAME -p 'DBNAME' < backup.sql
添加将DAL连接添加到新的mysql服务器。
然后它与旧的db相同。我遇到的问题是从pythonanywhere UI设置数据库创建了一个与我的旧数据库不同的数据库。所以如果我没记错的话,你也可以让web2py先创建db表,然后再做第2步。多数民众赞成我怎么做...如果我没记错的话;)希望它对你有所帮助。干杯
答案 1 :(得分: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)