web2py中独立使用DAL

2 投票
3 回答
3502 浏览
提问于 2025-04-17 19:41

我有一个来自web2py应用的sqlite数据库。
我想用gluon库来处理这些数据。
我看过这篇文章,但是我遇到了一个错误,提示DAL对象没有'user这个属性。
我理解的是,我需要使用在myapp/models/tables.py中定义的表。
我该如何在不使用web2py的情况下,单独使用gluon库来使用现有的数据库呢?

这是我的代码:

from gluon.sql import DAL, Field
from gluon.validators import *

module_path = os.path.abspath(os.path.dirname(__file__))
print module_path
dbpath = module_path + '/../databases/'

db_name = "storage.sqlite"

db = DAL('sqlite://' + db_name, folder=dbpath)
rows = db(db.user).select()

我的问题是,如何导入我在myapp/models/tables.py中定义的所有表?

3 个回答

0

你需要单独安装pydal,而不是直接使用从web2py环境中得到的pydal/dal版本。(还要检查一下你在web2py中用的pydal版本,并在Python中安装相同的版本)

pip install pydal==some_version_number

注意:你必须使用明确的路径来指向数据库表所在的文件夹。

from pydal import DAL

db = DAL("some_db_uri", folder="/some/full_path_to/database", auto_import=True)
0

你的代码中提到了 db.user,但是你并没有在代码里定义一个“用户”表。你不能从应用模型文件中导入表的定义,因为那不是一个Python模块。一个可能的解决办法是:

db = DAL('sqlite://' + db_name, folder=dbpath, auto_import=True)

这个方法会从 *.table 文件中读取表的元数据,并创建表的定义,不过这些定义不会包含一些特定于web2py的模型属性,比如字段验证器、标签等。如果你需要完整的DAL表定义,包含所有字段属性,你就得在你的外部代码中直接写出来。想了解更多细节,可以查看这里

另外,要使用 import gluon.dal,而不是 gluon.sql,因为后者早就不推荐使用了(它实际上是指向gluondal的)。

2

你可以使用 pydal 这个工具。

pip install pydal

然后,你可以这样做:

from pydal import DAL, Field
...

撰写回答