Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- Пример работы в SQLAlchemy с двумя таблицами, связанными отношением многие ко многим.
- """
- from sqlalchemy import Column, Integer, String, ForeignKey, create_engine, CheckConstraint
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy.orm import sessionmaker
- engine = create_engine('postgresql+psycopg2://user:user@127.0.0.1/test')
- Session = sessionmaker(bind=engine)
- Base = declarative_base()
- class Book(Base):
- __tablename__ = 'books'
- id = Column(Integer, primary_key=True)
- name = Column(String)
- rating = Column(Integer)
- __table_args__ = (CheckConstraint('rating >= 1 and rating <= 5', name='check_rating'), {})
- def __init__(self, name, rating):
- self.name = name
- self.rating = rating
- def __repr__(self):
- return "<Book(%s, '%s', %s)>" % (self.id, self.name, self.rating)
- class Author(Base):
- __tablename__ = 'authors'
- id = Column(Integer, primary_key=True)
- name = Column(String)
- def __init__(self, name):
- self.name = name
- def __repr__(self):
- return "<Author(%s, '%s')>" % (self.id, self.name)
- class AuthorToBook(Base):
- __tablename__ = 'authors_to_books'
- id = Column(Integer, primary_key=True)
- author_id = Column(Integer, ForeignKey('authors.id'))
- book_id = Column(Integer, ForeignKey('books.id'))
- def __init__(self, author, book):
- self.author_id = author
- self.book_id = book
- def __repr__(self):
- return "<AuthorToBook(id %s, author %s, book %s)>" % (self.id, self.author_id, self.book_id)
- Base.metadata.create_all(engine)
- session = Session()
- # чистим таблицы перед вставкой (для тестов)
- session.query(AuthorToBook).delete()
- session.query(Author).delete()
- session.query(Book).delete()
- session.commit()
- author1 = Author(name='Александр Сергеевич Пушкин')
- author2 = Author(name='Михаил Юрьевич Лермонтов')
- session.add_all([author1, author2])
- session.commit()
- print(*session.query(Author).all(), '', sep='\n')
- book1 = Book(name='Сказка о царе Салтане', rating=5)
- book2 = Book(name='Озорная классика для взрослых', rating=3)
- book3 = Book(name='Герой нашего времени', rating=4)
- session.add_all([book1, book2, book3])
- session.commit()
- print(*session.query(Book).all(), '', sep='\n')
- publication1 = AuthorToBook(author=author1.id, book=book1.id)
- publication2 = AuthorToBook(author=author1.id, book=book2.id)
- publication3 = AuthorToBook(author=author2.id, book=book2.id)
- publication4 = AuthorToBook(author=author2.id, book=book3.id)
- session.add_all([publication1, publication2, publication3, publication4])
- session.commit()
- print(*session.query(AuthorToBook).all(), '', sep='\n')
- """
- <Author(69, 'Александр Сергеевич Пушкин')>
- <Author(70, 'Михаил Юрьевич Лермонтов')>
- <Book(55, 'Сказка о царе Салтане', 5)>
- <Book(56, 'Озорная классика для взрослых', 3)>
- <Book(57, 'Герой нашего времени', 4)>
- <AuthorToBook(id 49, author 69, book 55)>
- <AuthorToBook(id 50, author 69, book 56)>
- <AuthorToBook(id 51, author 70, book 56)>
- <AuthorToBook(id 52, author 70, book 57)>
- """
- print('done')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement