Py4Web/Web2Py DAL遗留数据库探索:如何获取所有表、字段等信息?
我之前也遇到过一模一样的情况,刚创建的数据库能正常获取表结构,但连接已有库时db.tables返回空列表,分享几个亲测有效的解决思路:
别混淆folder参数和数据库路径的作用
你代码里的folder是用来存放迁移文件(migrations)的目录,不是数据库文件的位置!SQLite的路径是相对于当前项目的根目录,或者你可以直接写绝对路径。如果你的legacydb.sqlite确实在subdirectory/additionalsubdirectory下,应该把数据库路径改成:db = DAL('sqlite://subdirectory/additionalsubdirectory/legacydb.sqlite', auto_import=True)要是需要指定迁移文件目录,单独给
folder赋值就行,比如folder='migrations',别让它干扰数据库路径的识别。关闭自动迁移,避免冲突
当migrate=True(默认值)时,DAL会优先读取迁移文件里的表定义,而非自动从数据库导入。加上migrate=False可以强制DAL跳过迁移文件,直接用auto_import读取已有表:db = DAL('sqlite://legacydb.sqlite', auto_import=True, migrate=False)手动触发表结构导入
如果上面的方法还是不行,可以手动查询数据库里的表,然后强制DAL加载它们:from pydal import DAL, Field db = DAL('sqlite://legacydb.sqlite', migrate=False) # 查询SQLite里的所有用户表(排除系统表) table_names = [row[0] for row in db.executesql("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%';")] # 逐个定义表,*fake_migrate=True*告诉DAL表已存在 for name in table_names: db.define_table(name, fake_migrate=True) # 现在试试获取字段 print(db.person.fields)检查文件权限和存在性
确认你的程序有读取legacydb.sqlite文件的权限,尤其是在Linux/macOS下,子目录的权限可能限制了访问。另外也可以打印db._uri确认数据库路径是否正确,避免文件根本没找到。
至于为什么刚创建数据库时正常?因为那时候DAL会实时生成表结构和对应的迁移文件,内存里已经缓存了表的定义,自然能正常读取。而连接已有库时,迁移文件不存在或者路径错误,就导致auto_import没正确触发。
内容的提问来源于stack exchange,提问作者klausz

