Я задавал этот вопрос Как создать экземпляр записи таблицы, но не был добавлен в пониорм? где я спрашивал, как создать экземпляр класса, определенного как представление таблицы пониорм, без немедленного добавления Это. Используя sqlalchemy, где требуется явный add
в экземпляре session
, я думаю, что мне удалось использовать следующий код.
Сначала я создаю класс с именем AddInstance
, в котором есть метод add, а затем наследую от него во всех определениях моей таблицы. Кажется, это работает (т.е. я могу создать экземпляр класса и добавить его, только если я хочу относительно легко), но я не уверен, есть ли какие-либо непреднамеренные побочные эффекты, или это очень далеко от передовой практики.
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import Column, String, Integer
engine = create_engine('sqlite:///:memory:')
Base = declarative_base()
Session = sessionmaker(bind=engine)
class AddInstance:
def add(self):
session = Session()
session.add(self)
session.commit()
class Pizza(Base, AddInstance):
__tablename__ = 'pizzas'
id = Column(Integer, primary_key=True)
name = Column(String(50))
toppings = relationship('Topping', back_populates='name')
class Topping(Base, AddInstance):
__tablename__ = 'fruits'
id = Column(Integer, primary_key=True)
name = Column(String(50))
pizzas = relationship('Pizza', back_populates='name')
Base.metadata.create_all(engine)