py4web DAL, web2py - (устаревшее) исследование базы данных - как получить все таблицы, поля и т. д.?

К сожалению, нет тега py4web (это и один для модулей следует добавить), поэтому я поместил его под web2py, поскольку DAL такой же. Если кто-то может создать тег (возможно, поговорив с Массимо ..), это приветствуется.

С помощью 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 

Даже зная, что за столом есть человек, поля не отображаются.

Но он работает, когда база данных и таблицы созданы, и сразу после этого я делаю «акс».

Как это может быть сделано?


person klausz    schedule 19.01.2021    source источник


Ответы (1)


пожалуйста, убедитесь, что он относится к той же папке базы данных, где *.table доступна там, если запустите pydal на py4web или терминале, убедитесь, что вы выполняете 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)

на ноутбуке2 такой же, как и на ноутбуке1

но когда удалите *.table в папке базы данных и перезапустите ноутбук2, результат для

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

не найден на ноутбуке2

ссылка на pydal на сайте web2py

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

person steve van christie    schedule 20.01.2021
comment
Стив, что вы подразумеваете под: *.tables? - person klausz; 20.01.2021
comment
Стив, что вы подразумеваете под: *.tables? Но центральный вопрос или идея. Предположим, у меня есть права доступа ко всем таблицам в базе данных, что может быть ограничивающим фактором в Oracle. Я бы интерпретировал: «Если нам просто нужен доступ к данным, но не к атрибутам таблицы web2py, мы уходим без переопределения таблиц, а просто просим web2py прочитать необходимую информацию из метаданных в файлах .table: .. Это позволяет нам получить доступ к любой таблице db.table без необходимости ее переопределения». чтобы я обращался к базе данных (с необходимыми правами доступа) и спрашивал, какие там таблицы? Получение всех имен таблиц. - person klausz; 20.01.2021
comment
*.table — это файл, созданный при создании таблицы базы данных с помощью pydal, и он будет обновлен, если вы изменили свою define_table. пожалуйста, загляните в папку с базами данных, и вы увидите файлы *.table и sql.log. - person steve van christie; 20.01.2021
comment
Я не нашел файл *.table в каталоге файлов. У меня всегда есть файл для каждой таблицы. Но не внутри команд SQL. Но что я нашел: SELECT name FROM sqlite_master WHERE type='table' Это соответствует команде Oracle select all_tables. - person klausz; 21.01.2021
comment
Файл журнала есть, когда я использую py4web (web2py), но не когда я использую компонент pyDAL через ноутбуки jupyter. - person klausz; 21.01.2021
comment
недостаточно информации, почему вы не можете видеть *.table, обычно он создается pydal либо в виде отдельного модуля, либо в любой другой среде, включенной в jupyter env, поэтому в основном *.table содержит информацию, которая представляет то, что было написано в define_table. Быстрый вывод: если не определить define_table и установить auto_import = True, pydal увидит содержимое *.table и сможет взаимодействовать с таблицей (например, приведенный выше пример) - person steve van christie; 21.01.2021