class Parent(db.Model):
    __tablename__ = 'parents'
   Â
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
 Â
    # many to many relationship between parent and children
    # my case allows for a children to have many parents. Don't ask.
    children = db.relationship('Child',
                secondary=parents_children_relationship,
                backref=db.backref('parents', lazy='dynamic'),
                lazy='dynamic')
 Â
    # many to many relationship between parents and pets
    pets = db.relationship('Pet',
                 secondary=users_pets_relationship,
                 backref=db.backref('parents', lazy='dynamic'), #
                 lazy='dynamic')
  # many to many relationship between parents and children
  parents_children_relationship = db.Table('parents_children_relationship',
    db.Column('parent_id', db.Integer, db.ForeignKey('parents.id')),
    db.Column('child_id', db.Integer, db.ForeignKey('children.id')),
    UniqueConstraint('parent_id', 'child_id'))
 Â
  # many to many relationship between User and Pet
  users_pets_relationship = db.Table('users_pets_relationship',
    db.Column('parent_id', db.Integer, db.ForeignKey('parents.id')),
    db.Column('pet_id', db.Integer, db.ForeignKey('pets.id')),
    UniqueConstraint('parent_id', 'pet_id'))
  class Child(db.Model):
    __tablename__ = 'children'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    # parents = <backref relationship with User model>
 Â
    # one to many relationship with pets
    pets = db.relationship('Pet', backref='child', lazy='dynamic')
 Â
 Â
  class Pet(db.Model):
    __tablename__ = 'pets'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    # child = backref relationship with cities
    child_id = db.Column(db.Integer, db.ForeignKey('children.id'), nullable=True)
    # parents = <relationship backref from User>  parent_a = Parent()  Â
  child_a = Child()
  pet_a = Pet()  parent_a.children.append(child_a)
  # commit/persist data
  parent_a.children.all() # [child_a]  child_a.pets.append(pet_a)
  parent_a.children.append(child_a)
  # commit/persist data
  parent_a.children.all() # [child_a]
  parent_a.pets.all() # [pet_a], because pet_a gets
            # automatically added to parent using some sorcery
            # like for child in parent_a.children.all():
            #   parent.pets.append(child.pets.all())
            # or something like that.I can achieve this with a method in the Parent object like add_child_and_its_pets(),
but I would like to override the way relationship works, so I don't
need to override other modules that may benefit from this behaviour,
like Flask-Admin for instance.
Basically how should I override the backref.append method or the relationship.append method to also append other objects from other relationships at call time i.e. on the python side? How should I override the remove methods as well?
@db.event.listens_for(Parent.children, 'append')
def _append_children(parent, child, initiator):
  """
  If a new child is appended to the parent, this listener
  will also add the pets bound to the child being bound to the parent.
  """
  # appends also the pets bound to the child that the
  # parent is being appended to
  parent.pets.extend(child.pets.all())
@db.event.listens_for(Parent.children, 'remove')
def _remove_children(parent, child, initiator, *args, **kwargs):
  """
  If a child is removed from the parent, this listener
  will also remove only remove_single_pet --> <Pet>
  """
 Â
  remove_single_pet = kwargs.get('remove_single_pet', None)
  if remove_single_pet is not None:
    parent.pets.remove(remove_single_pet)
  else: # removes every pet
    for pet in child.pets:
      parent.pets.remove(pet)
@db.event.listens_for(Parent.pets, 'remove')
def _remove_pets(parent, pet, initiator, *args, **kwargs):
  """
  If a pet is removed from the parent, and the parent also is related
  to the child that has access to that pet, then
  * removes relationship with the child, and
  * keeps relationship with the remaining pets, except the one that was removed
  """
  if pet.child in parent.children.all():      Â
    remove_single_pet = pet
    _remove_children(parent, pet.child, initiator, remove_single_pet)
#### test.py
 def test_child_pet_relationship_on_parents(self):
    # create new parent
    test_parent = Parent(name='test_parent')
    # commit parent to the database
    db.session.add(test_parent)
    db.session.commit()
    child1 = Child(id=1,
           name='FakeChild1')
    child2 = Child(id=2,
           name='FakeChild2')
    pet1 = Pet(id=1,
          name='FakePet1',
          child_id=1)
    pet2 = Pet(id=2,
          name='FakePet2',
          child_id=2)
    pet3 = Pet(id=3,
          name='FakePet3',
          child_id=1)
    db.session.add(child1)
    db.session.add(child2)
    db.session.add(pet1)
    db.session.add(pet2)
    db.session.add(pet3)
    db.session.commit()
    # add parent to the child
    child1.parents.append(test_parent)
    # add parent to the child
    pet2.parents.append(test_parent)
    # persist changes in the db
    db.session.add(child1)
    db.session.add(pet2)
    db.session.commit()
    # check that previous relationships are intact
    self.assertTrue(child1.pets.all() == [pet1, pet3])
    self.assertTrue(child2.pets.all() == [pet2])
    # resultant elements should be only child1, its pets and the single Pet
    self.assertTrue(test_parent.children.all() == [child1])
    self.assertTrue(test_parent.pets.all() == [pet1, pet2, pet3])
    # remove child from parent
    pet3.parents.remove(test_parent)
    # resultant elements should be remaining pets, and no child
    self.assertTrue(test_parent.children.all() == [])
    self.assertTrue(test_parent.pets.all() == [pet1, pet2]) # pet2 was not touched,
                                # but pet1 should remain since only
                                # pet3 was removed
                                # child1 should be also removed since
                                # relationship is unbalanced, i.e.
                                # user can't have access to a child if it
                                # does not have access to all of the child's pets
sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'parent_pets_relationship' expected to delete 1 row(s); Only 0 were matched.
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
# many to many relationship between parents and children
parents_children_relationship = sa.Table('parents_children_relationship',
  Base.metadata,
  sa.Column('parent_id', sa.Integer, sa.ForeignKey('parents.id')),
  sa.Column('child_id', sa.Integer, sa.ForeignKey('children.id')),
  sa.UniqueConstraint('parent_id', 'child_id'))
# many to many relationship between User and Pet
parents_pets_relationship = sa.Table('parents_pets_relationship',
  Base.metadata,
  sa.Column('parent_id', sa.Integer, sa.ForeignKey('parents.id')),
  sa.Column('pet_id', sa.Integer, sa.ForeignKey('pets.id')),
  sa.UniqueConstraint('parent_id', 'pet_id'))
class Parent(Base):
  __tablename__ = 'parents'
 Â
  id = sa.Column(sa.Integer, primary_key=True)
  name = sa.Column(sa.String(64))
  # many to many relationship between parent and children
  # my case allows for a children to have many parents. Don't ask.
  children = sa.orm.relationship('Child',
              secondary=parents_children_relationship,
              backref=sa.orm.backref('parents', lazy='dynamic'),
              lazy='dynamic')
  # many to many relationship between parents and pets
  pets = sa.orm.relationship('Pet',
              secondary=parents_pets_relationship,
              backref=sa.orm.backref('parents', lazy='dynamic'), #
              lazy='dynamic')
 Â
  def __repr__(self):
    return '<Parent (name=%r)>' % (self.name)
class Child(Base):
  __tablename__ = 'children'
  id = sa.Column(sa.Integer, primary_key=True)
  name = sa.Column(sa.String(64))
  # parents = <backref relationship with User model>
  # one to many relationship with pets
  pets = sa.orm.relationship('Pet', backref='child', lazy='dynamic')
  def __repr__(self):
    return '<Child (name=%r)>' % (self.name)
class Pet(Base):
  __tablename__ = 'pets'
  id = sa.Column(sa.Integer, primary_key=True)
  name = sa.Column(sa.String(64))
  # child = backref relationship with cities
  # parents = <relationship backref from User>
  def __repr__(self):
    return '<Pet (name=%r)>' % (self.name)
@sa.event.listens_for(Parent.children, 'append')
def _append_children(parent, child, initiator):
  """
  If a new child is appended to the parent, this listener
  will also add the pets bound to the child being bound to the parent.
  """
  # appends also the pets bound to the child that the
  # parent is being appended to
  parent.pets.extend(child.pets.all())
@sa.event.listens_for(Parent.children, 'remove')
def _remove_children(parent, child, initiator, *args, **kwargs):
  """
  If a child is removed from the parent, this listener
  will also remove only remove_single_pet --> <Pet>
  """
 Â
  remove_single_pet = kwargs.get('remove_single_pet', None)
  if remove_single_pet is not None:
    parent.pets.remove(remove_single_pet)
  else: # removes every pet
    for pet in child.pets:
      parent.pets.remove(pet)
@sa.event.listens_for(Parent.pets, 'remove')
def _remove_pets(parent, pet, initiator, *args, **kwargs):
  """
  If a pet is removed from the parent, and the parent also is related
  to the child that has access to that pet, then
  * removes relationship with the child, and
  * keeps relationship with the remaining pets, except the one that was removed
  """
  if pet.child in parent.children.all():      Â
    remove_single_pet = pet
    _remove_children(parent, pet.child, initiator, remove_single_pet)
#### test ###
import unittest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
class BasicTestModelCase(unittest.TestCase):
  def setUp(self):
    e = create_engine("sqlite://", echo=True)
    Base.metadata.create_all(e)
    Session = sessionmaker(bind=e)
    self.session = Session()
   Â
  def tearDown(self):
    # Base.metadata.drop_all()
    pass
  def test_child_pet_relationship_on_parents_combined(self):
    """
    Test that a parent can be hold children and pets that don't
    belong necessary to the child, given the behaviour tested in the
    previous test.
    """
    # create new parent
    test_parent = Parent(name='test_parent')
    child1 = Child(id=1,
            name='FakeChild1')
    child2 = Child(id=2,
            name='FakeChild2')
    pet1 = Pet(id=1,
          name='FakePet1',
          child_id=1)
    pet2 = Pet(id=2,
          name='FakePet2',
          child_id=2)
    pet3 = Pet(id=3,
          name='FakePet3',
          child_id=1)
    self.session.add(test_parent)
    self.session.add(child1)
    self.session.add(child2)
    self.session.add(pet1)
    self.session.add(pet2)
    self.session.add(pet3)
    self.session.commit()
    # add parent to the child
    child1.parents.append(test_parent)
    self.session.add(child1)
    self.session.commit()
   Â
    # add parent to the child
    pet2.parents.append(test_parent)
    # persist changes in the db
    self.session.add(pet2)
    self.session.commit()
    print(test_parent.pets.all())
    print(child2.pets.all())
    # check that previous relationships are intact
    self.assertTrue(child1.pets.all() == [pet1, pet3])
    self.assertTrue(child2.pets.all() == [pet2])
    # resultant elements should be only child1, its pets and the single Pet
    self.assertTrue(test_parent.children.all() == [child1])
    self.assertTrue(test_parent.pets.all() == [pet1, pet2, pet3])
    # remove child from parent
    pet3.parents.remove(test_parent) ## ERROR here
    # resultant elements should be remaining pets, and no child
    self.assertTrue(test_parent.children.all() == [])
    self.assertTrue(test_parent.pets.all() == [pet1, pet2]) # pet2 was not touched,
                                # but pet1 should remain since only
                                # pet3 was removed
                                # child1 should be also removed since
                                # relationship is unbalanced, i.e.
                                # user can't have access to a child if it
                                # does not have access to all of the child's pets
if __name__ == '__main__':
  # run tests
  unittest.main()
at the core is that when you remove a child from the parent in the
_remove_pets event, you want to prevent the _remove_children() event
from actually happening, I think.
If I remove a pet from a parent, then we remove the child from the
parent, and *only* that pet. we dont remove other pets that might be
associated with that child.
if I remove a child from the parent, then we remove *all* pets
associated with the child from that parent.
This seems like it's a contradiction. I have parent p1, not referring
to child c1, but it refers to pet p1 which *does* refer to child c1,
and that is valid.   There's basically two flavors of "remove child
from parent", is that right?
I tried to work on an implementation here which would also have to be
extremely clever but I realized I don't actually understand what this
is supposed to do. if "remove child from parent" has two different
flavors then there needs to be all kinds of trickery to protect the
events from each other.
> email to sqlalchemy+unsubscribe@googlegroups.com.
> To post to this group, send email to sqlal...@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to a topic in the Google Groups "sqlalchemy" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/sqlalchemy/jgKgv5zQT7E/unsubscribe.
To unsubscribe from this group and all its topics, send an email to sqlalchemy+unsubscribe@googlegroups.com.
I tried to work on an implementation here which would also have to be
extremely clever but I realized I don't actually understand what this
is supposed to do. if "remove child from parent" has two different
flavors then there needs to be all kinds of trickery to protect the
events from each other.
the main complication here is that those "dynamic" relationships
require that a query runs for everything, which means everything has
to be in the database, which means it flushes the session very
aggressively (and also disabling the flush, another thing I tried,
means it doesn't read the contents of the collections accurately), and
all of that makes an already tricky operation nearly impossible
without it barreling into itself.
If you are committed to using the "dynamic" relationships, you can
always rely on emitting SQL to read from those association tables, and
there's a completely unorthodox way to do this which would be way more
efficient in most cases, and is extremely simple, just emit the DELETE
statements:
`session_object`? to expose the `execute` method? What is that I am "bypassing" by using this over the orm? parent.children.append(child)child.parents.append(parent)import logging
import sys
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
# setup logger
stdout_handler = logging.StreamHandler(sys.stdout)
formatter = logging.Formatter('%(asctime)s:%(filename)s:%(lineno)d\t%(levelname)s\t%(message)s')
stdout_handler.setFormatter(formatter)
logger = logging.getLogger('sqlalchemy.engine')
logger.setLevel(logging.DEBUG)
logger.addHandler(stdout_handler)from sqlalchemy.orm import object_session
@sa.event.listens_for(Parent.children, 'append')
def _on_append_children(parent, child, initiator):
  """
  If a new child is appended to the parent, this listener
  will also add the pets bound to the child being bound to the parent.
  """
  # appends also the pets bound to the child that the
  # parent is being appended to
 Â
  logger.debug(f'**********1. adding the pets of {child} to {parent}***************')
  object_session(parent).execute(
    "INSERT INTO parents_pets_relationship VALUES "
    "(:parent_id, :pet_id)",
    [
      {"parent_id": parent.id, "pet_id": pet.id}
      for pet in child.pets
    ]
  )
  logger.debug('**********1. done!***************')
@sa.event.listens_for(Parent.children, 'remove')
def _on_remove_children(parent, child, initiator, *args, **kwargs):
  """
  If a child is removed from the parent, this listener
  will also remove only remove_single_pet --> <Pet>
  """
 Â
  object_session(parent).execute(
    "DELETE FROM parents_pets_relationship WHERE "
    "parent_id=:parent_id AND pet_id=:pet_id",
    [
      {"parent_id": parent.id, "pet_id": pet.id}
      for pet in child.pets
    ]
  )
@sa.event.listens_for(Parent.pets, 'remove')
def _on_remove_pets(parent, pet, initiator, *args, **kwargs):
  """
  If a pet is removed from the parent, and the parent also is related
  to the child that has access to that pet, then
  * removes relationship with the child, and
  * keeps relationship with the remaining pets, except the one that was
removed
  """
 Â
  object_session(parent).execute(
    "DELETE FROM parents_children_relationship WHERE "
    "parent_id=:parent_id AND child_id=:child_id",
    {"parent_id": parent.id, "child_id": pet.child.id}
  )
#### test ###
import unittest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
class BasicTestModelCase(unittest.TestCase):
  def setUp(self):
    self.engine = create_engine("sqlite://", echo=False)
    Base.metadata.create_all(self.engine)
    Session = sessionmaker(bind=self.engine)
    self.session = Session()
   Â
  def tearDown(self):
    Base.metadata.drop_all(bind=self.engine)
    logger.debug('************A - add test_parent to child1***************')
    child1.parents.append(test_parent)
    self.session.add(child1)
    self.session.commit()
    logger.debug('**********A - done!***************')
   Â
    # add parent to the child
    pet2.parents.append(test_parent)
    logger.debug('************B - add test_parent to child1***************')
    # persist changes in the db
    self.session.add(pet2)
    self.session.commit()
    logger.debug('**********B - done!***************')
    print(test_parent.pets.all())
    print(child2.pets.all())
    # check that previous relationships are intact
    self.assertTrue(child1.pets.all() == [pet1, pet3])
    self.assertTrue(child2.pets.all() == [pet2])
    # resultant elements should be only child1, its pets and the single Pet
    self.assertTrue(test_parent.children.all() == [child1])
    self.assertTrue(test_parent.pets.all() == [pet1, pet2, pet3])
    # remove child from parent
    logger.debug('***********C - remove test_parent from pet3****************')
    pet3.parents.remove(test_parent) ## ERROR here
    logger.debug('**********C - done!***************')
    # resultant elements should be remaining pets, and no child
    self.assertTrue(test_parent.children.all() == [])
    self.assertTrue(test_parent.pets.all() == [pet1, pet2]) # pet2 was not touched,
                                # but pet1 should remain
                                # since only                                Â
                                # pet3 was removed                                Â
                                # child1 should be also removed since                                Â
                                # relationship is unbalanced, i.e.                                Â
                                # user can't have access to a child if it                                Â
                                # does not have access to all of the child's pets
  def test_child_pet_relationship_on_parents_combined_reversed(self):
    logger.debug('************A` - add child1 to test_parent***************')
    # add parent to the child
    test_parent.children.append(child1)
    self.session.add(test_parent)
    self.session.commit()
    logger.debug('**********A` - done!***************')
   Â
    logger.debug('************B` - add pet2 to test_parent***************')
    # add parent to the child
    test_parent.pets.append(pet2)
    # persist changes in the db
    self.session.add(test_parent)
    self.session.commit()
    logger.debug('**********B` - done!***************')
    # check that previous relationships are intact
    self.assertTrue(child1.pets.all() == [pet1, pet3])
    self.assertTrue(child2.pets.all() == [pet2])
    # resultant elements should be only child1, its pets and the single Pet
    self.assertTrue(test_parent.children.all() == [child1])
    self.assertTrue(test_parent.pets.all() == [pet1, pet2, pet3])
    # remove child from parent
    logger.debug('***********C` - remove pet3 from test_parent****************')
    test_parent.pets.remove(pet3)
    logger.debug('**********C` - done!***************')
    # resultant elements should be remaining pets, and no child
    self.assertTrue(test_parent.children.all() == [])
    self.assertTrue(test_parent.pets.all() == [pet1, pet2]) # pet2 was not touched,
                                # but pet1 should remain
                                # since only                                Â
                                # pet3 was removed                                Â
                                # child1 should be also removed since                                Â
                                # relationship is unbalanced, i.e.                                Â
                                # user can't have access to a child if it                                Â
                                # does not have access to all of the child's pets
import sys
if __name__ == '__main__':
  # # run tests
  unittest.main()
2018-05-18 20:54:58,686:pets2.py:284 Â Â DEBUG Â ************A` - add child1 to test_parent***************
2018-05-18 20:54:58,692:base.py:682 Â Â INFO Â Â BEGIN (implicit)
2018-05-18 20:54:58,694:base.py:1151 Â Â INFO Â Â SELECT children.id AS children_id, children.name AS children_name
FROM children
WHERE children.id = ?
2018-05-18 20:54:58,695:base.py:1154 Â Â INFO Â Â (1,)
2018-05-18 20:54:58,696:result.py:681 Â DEBUG Â Col ('children_id', 'children_name')
2018-05-18 20:54:58,696:result.py:1106 Â DEBUG Â Row (1, 'FakeChild1')
2018-05-18 20:54:58,698:base.py:1151 Â Â INFO Â Â SELECT parents.id AS parents_id, parents.name AS parents_name
FROM parents
WHERE parents.id = ?
2018-05-18 20:54:58,698:base.py:1154 Â Â INFO Â Â (1,)
2018-05-18 20:54:58,699:result.py:681 Â DEBUG Â Col ('parents_id', 'parents_name')
2018-05-18 20:54:58,699:result.py:1106 Â DEBUG Â Row (1, 'test_parent')
2018-05-18 20:54:58,700:pets2.py:102 Â Â DEBUG Â **********1. adding the pets of <Child (name='FakeChild1')> to <Parent (name='test_parent')>***************
2018-05-18 20:54:58,703:base.py:1151 Â Â INFO Â Â INSERT INTO parents_children_relationship (parent_id, child_id) VALUES (?, ?)
2018-05-18 20:54:58,703:base.py:1154 Â Â INFO Â Â (1, 1)
2018-05-18 20:54:58,705:base.py:1151 Â Â INFO Â Â SELECT pets.id AS pets_id, pets.name AS pets_name, pets.child_id AS pets_child_id
FROM pets
WHERE ? = pets.child_id
2018-05-18 20:54:58,705:base.py:1154 Â Â INFO Â Â (1,)
2018-05-18 20:54:58,705:result.py:681 Â DEBUG Â Col ('pets_id', 'pets_name', 'pets_child_id')
2018-05-18 20:54:58,706:result.py:1106 Â DEBUG Â Row (1, 'FakePet1', 1)
2018-05-18 20:54:58,706:result.py:1106 Â DEBUG Â Row (3, 'FakePet3', 1)
2018-05-18 20:54:58,707:base.py:1151 Â Â INFO Â Â INSERT INTO parents_pets_relationship VALUES (?, ?)
2018-05-18 20:54:58,707:base.py:1154 Â Â INFO Â Â ((1, 1), (1, 3))
2018-05-18 20:54:58,707:pets2.py:113 Â Â DEBUG Â **********1. done!***************
2018-05-18 20:54:58,709:base.py:1151 Â Â INFO Â Â INSERT INTO parents_children_relationship (parent_id, child_id) VALUES (?, ?)
2018-05-18 20:54:58,709:base.py:1154 Â Â INFO Â Â (1, 1)
2018-05-18 20:54:58,710:base.py:702 Â Â INFO Â Â ROLLBACK
> email to sqlalchemy+unsubscribe@googlegroups.com.
> To post to this group, send email to sqlal...@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to a topic in the Google Groups "sqlalchemy" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/sqlalchemy/jgKgv5zQT7E/unsubscribe.
To unsubscribe from this group and all its topics, send an email to sqlalchemy+unsubscribe@googlegroups.com.
I ran this with a deep breath because I never did really understand
the first case why this problematic nested flush seemed to be needed.
 Fortunately, both tests passed here and it got away with not having
to flush inside the event handler.
>>> > email to sqlalchemy+unsubscribe@googlegroups.com.
>>> > To post to this group, send email to sqlal...@googlegroups.com.
>>> > Visit this group at https://groups.google.com/group/sqlalchemy.
>>> > For more options, visit https://groups.google.com/d/optout.
>>>
>>> --
>>> SQLAlchemy -
>>> The Python SQL Toolkit and Object Relational Mapper
>>>
>>> http://www.sqlalchemy.org/
>>>
>>> To post example code, please provide an MCVE: Minimal, Complete, and
>>> Verifiable Example. See http://stackoverflow.com/help/mcve for a full
>>> description.
>>> ---
>>> You received this message because you are subscribed to a topic in the
>>> Google Groups "sqlalchemy" group.
>>> To unsubscribe from this topic, visit
>>> https://groups.google.com/d/topic/sqlalchemy/jgKgv5zQT7E/unsubscribe.
>>> To unsubscribe from this group and all its topics, send an email to
>>> To post to this group, send email to sqlal...@googlegroups.com.
>>> Visit this group at https://groups.google.com/group/sqlalchemy.
>>> For more options, visit https://groups.google.com/d/optout.
>>
>>
>> --
>> SQLAlchemy -
>> The Python SQL Toolkit and Object Relational Mapper
>>
>> http://www.sqlalchemy.org/
>>
>> To post example code, please provide an MCVE: Minimal, Complete, and
>> Verifiable Example. See http://stackoverflow.com/help/mcve for a full
>> description.
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "sqlalchemy" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to sqlalchemy+unsubscribe@googlegroups.com.
>> To post to this group, send email to sqlal...@googlegroups.com.
>> Visit this group at https://groups.google.com/group/sqlalchemy.
>> For more options, visit https://groups.google.com/d/optout.
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to a topic in the Google Groups "sqlalchemy" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/sqlalchemy/jgKgv5zQT7E/unsubscribe.
To unsubscribe from this group and all its topics, send an email to sqlalchemy+unsubscribe@googlegroups.com.