0

不幸的是,没有 py4web 标签(应该添加一个用于模块的标签)所以我把它放在 web2py 下,因为 DAL 是相同的。如果有人可以创建标签(也许与 Massimo 交谈 ..),我们将不胜感激。

使用 py4web/web2py 几乎可以访问任何数据库。使用自动导入,无需再次定义字段。

from pydal import DAL, Field

db = DAL('sqlite://legacydb.sqlite', folder='subdirectory/additionalsubdirectory', auto_import=True)

现在应该可以获取所有表、列等。(在 Oracle 中:select * from all_tables、select * from user_tab_columns 等可用于此)

db.tables

它不工作。(它说它是空的,但有两张桌子。

db.person.fields 

即使知道那里有桌人,也不会显示这些字段。

但是它在创建数据库和表时工作,然后我立即“aks”。

如何才能做到这一点?

4

1 回答 1

0

请确保它引用同一个数据库文件夹,其中 *.table 可用,如果在 py4web 或终端上运行 pydal,请确保执行 db.commit() 如果不是,它只是存储在内存中而不是写入数据库

例如

在 jupyter 笔记本中(创建了两个笔记本,1 个用于 define_table,auto_import=False,另一个没有 define_table,auto_import=True)

笔记本1

from pydal import DAL, Field
from datetime import datetime
now = datetime.now()
db = DAL('sqlite://jupyter_pydal.sqlite', folder = 'databases', auto_import = False)
db.define_table('test',
    Field('string_0'),
    Field('text_0', 'text'),
    Field('integer_0', 'integer'), 
    Field('double_0', 'double'),
    Field('date_0', 'date'),
    Field('datetime_0', 'datetime'),
    #format = lambda r: f'{r.name}' )
    format = lambda r: '%s' % (r.name) )
if db(db.test).isempty():
    p0 = db.test.insert(string_0 = 'string_0', text_0 = 'text_0', integer_0 = 0, double_0 = 0, date_0 = now, datetime_0 = now)
    p1 = db.test.insert(string_0 = 'string_1', text_0 = 'text_1', integer_0 = 1, double_0 = 1, date_0 = now, datetime_0 = now)
db.commit()
db._uri
db._dbname
db.tables
db.test.fields
db.test.string_0.type
rows = db(db.test).select()
print(rows)

笔记本2

from pydal import DAL, Field
db = DAL('sqlite://jupyter_pydal.sqlite', folder = 'databases', auto_import = True)
db._uri
db._dbname
db.tables
db.test.fields
db.test.string_0.type
rows = db(db.test).select()
print(rows)

命令的结果

db._uri
db._dbname
db.tables
db.test.fields
db.test.string_0.type
rows = db(db.test).select()
print(rows)

在 notebook2 上与 notebook1 相同

但是当删除数据库文件夹上的 *.table 并重新运行 notebook2 时,结果为

db.tables
db.test.fields
db.test.string_0.type
rows = db(db.test).select()
print(rows)

在 notebook2 上找不到

web2py 网站上 pydal 的参考

http://web2py.com/books/default/chapter/29/06/the-database-abstraction-layer#Using-DAL-without-define-tables

于 2021-01-20T14:19:53.080 回答