Таблица базы данных PonyORM Dynami c Определение - PullRequest
1 голос
/ 08 апреля 2020

Насколько я знаю из проведенного мною исследования, типичный способ определения таблицы с использованием PonyORM в Python выглядит следующим образом:

from pony.orm import *
db = Database()
# Database connection ...
class SampleTable(db.entity):
    sample_int_field = Required(int)
    sample_string_field = Required(str)
    # ...
db.generate_mapping(create_tables=True)

Моя проблема: это использует db.entity

от sh до определение таблицы без использования специфицированного c экземпляра базы данных в абстрактном общем виде, и подключите его к экземпляру, когда мне нужно.

есть ли способ сделать это?

концепция (предположительно, не настоящий исполняемый код):


# SampleAbstractTable.py

from pony.orm import *
class SampleAbstractTable(Database):  
    sample_int_field = Required(int)
    sample_string_field = Required(str)
    # ...

# main.py

from pony.orm import *
import SampleAbstractTable
db = Database()
# Database connection ...
db.connectTables((SampleAbstractTable.SampleAbstractTable, ...))
db.generate_mapping(create_tables=True)

РЕДАКТИРОВАТЬ:

У меня есть одна идея - создать класс-обертку для базы данных, которую я sh буду использовать с определенной группой таблиц, и определить таблицы в init, потому что весь смысл в том, что я хочу определить Таблицы динамически должны отделить создание экземпляра базы данных от определений классов таблиц, а именно:

from pony.orm import *
class sampleDatabase:
    def __init__(self):
        self._db = Database()
        # Database connection ...
        class TableA(db.entity):
            # ...
        class TableB(db.entity):
            # ...
        self._db.generate_mapping(create_tables=True)

, но тогда у меня возникают проблемы с доступом к таблицам базы данных ...

1 Ответ

1 голос
/ 08 апреля 2020

Прежде всего, вы работаете с сущностями, а не с таблицами. Это не одно и то же.

Ваша проблема может быть решена путем простого определения функции, такой как фабрика

def define_entities(db):
    class Entity1(db.Entity):
        attr1 = Required(str)
        ... and so on

А потом, когда вы создаете свой экземпляр Database, вы просто вызываете

db = Database(...)
define_entities(db)
...