im nachfolgenden ausführbaren Quelltext werden insgesamt drei Tabellen angelegt. Die Konstruktion zielt auf die n:m-Beziehung ab. Nun, einige Datensätze werden nach der erfolgreichen Ausführung in die Datenbank gespeichert. Jetzt möchte ich so simulieren, dass ich später, nachträglich, die Datensätze miteinander in Beziehung setzen möchte. Das Problem bei den meisten Beispielen, die ich im Internet finde, ist, dass diese so aufgeführt werden, dass erst einmal die einzelnen Tabellen mit Daten gefüllt werden, und anschließend in einem Rutsch die Zuordnungstabelle entsprechend gefüttert wird. Als Beispiel hier: Creating and populating a database using Python and SQLalchemy. Part 2: Classes and queries. Dieses Beispiel ist super und funktioniert.
ABER: Die Sache ist einfach die: Ich möchte nicht alles in einem Rutsch abfertigen. Ich möchte quasi später, zu einem anderen Zeitpunkt, mit den bereits abgespeicherten Datensätzen arbeiten, und diese in der Zuordnungstabelle unterbringen. Allerdings habe ich keine Idee, wie ich das bewerkstelligen soll.
Code: Alles auswählen
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship, backref
from sqlalchemy.ext.associationproxy import association_proxy
#memory_url = 'sqlite:///:memory:')
#sqlite_url = 'sqlite:///test.db'
mysql_url = '{dbms}+{dbdriver}://{dbuser}:{dbuser_pwd}@{db_server_host}:{dbport}/{db_name}'.format(
dbms='mysql', dbdriver='pymysql', dbuser='root', dbuser_pwd='', db_server_host='localhost', dbport=3306, db_name='test')
engine = sqlalchemy.create_engine(mysql_url, echo=True)
Base = declarative_base()
class Order_Product(Base):
__tablename__ = 'order_product'
order_id = Column(Integer, ForeignKey('orders.id'), primary_key=True)
product_id = Column(Integer, ForeignKey('products.id'), primary_key=True)
quantity = Column(String(30))
order = relationship("Order", backref=backref("order_product", lazy='dynamic', cascade="all, delete-orphan" ))
product = relationship("Product", backref=backref("order_product", lazy='dynamic', cascade="all, delete-orphan" ))
def __init__(self, order, product, quantity):
self.order = order
self.product = product
self.quantity = quantity
class Product(Base):
__tablename__ = 'products'
id = Column(Integer, primary_key=True, unique=True)
name = Column(String(80))
orders = relationship("Order", secondary="order_product")
def __init__(self, name):
self.name = name
class Order(Base):
__tablename__ = 'orders'
id = Column(Integer, primary_key=True, unique=True)
name = Column(String(80))
orders = relationship("Product", secondary="order_product")
def __init__(self, name):
self.name = name
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
prod1 = Product(name="Oreo")
prod2 = Product(name="Hide and Seek")
prod3 = Product(name="Marie")
prod4 = Product(name="Good Day")
session.add_all([prod1, prod2, prod3, prod4])
session.commit()
order1 = Order( name = "First Order")
order2 = Order( name = "Second Order")
order3 = Order( name = "Third Order")
order4 = Order( name = "Fourth Order")
session.add_all([order1, order2, order3, order4])
session.commit()
# Done! User makes a long break
# One hour later
# User wants to fill the allocation table named Order_Product
# [...]