Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 20, 2013 00:42:37

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy помогите разобратса (на примере)

Помогите разобраться!
На SQLAlchemy конструирую классику жанра две таблицы Books и Authors причем в одной книги может быть много авторов, и если имя автора уже есть в БД то оно используется.

import os
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Boolean, ForeignKey
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, relationship
DEFAULT_DIR = ''
SQLITE_DB = 'study_sqlalchemy.sqlite'
sql_path = "sqlite:///{0}".format(os.path.join(DEFAULT_DIR, SQLITE_DB))
engine = create_engine(sql_path, echo=False)
Base = declarative_base()
class Books(Base):
    __tablename__ = 'books'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    author = relationship("Author")
class Author(Base):
    __tablename__ = 'author'
    id = Column(Integer, primary_key=True)
    book_id = Column(Integer, ForeignKey('books.id'))
    name = Column(String)
class BookStore:
    def __init__(self):
        self.book_name = ''
        self.authors_name_list = []
        self.book = Books()
        self.authors = []
        metadata = Base.metadata
        metadata.create_all(engine)
        Session = sessionmaker(bind=engine)
        self.session = Session()
    def add(self):
        self.book.name = self.book_name
        self.book.author = []
        for author_name in self.authors_name_list:
            author_lst = self.session.query(Author).filter_by(name=author_name)
            #pdb.set_trace()
            if not author_lst.count():
                author = Author()
                author.name = author_name
            else:
                author = author_lst[0]
            self.book.author.append(author)
if __name__ == '__main__':
    books = BookStore()
    books.book_name = 'Book1'
    books.authors_name_list = ['Author1 Book1', 'Author2 Book1']
    books.add()
При выполнении books.add() ничего не происходит

Офлайн

#2 Июнь 20, 2013 05:47:17

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

SQLAlchemy помогите разобратса (на примере)

self.session.commit() ?



Офлайн

#3 Июнь 20, 2013 09:36:10

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy помогите разобратса (на примере)

plusplus
self.session.commit() ?
Так тоже ничего. Просто забыл дописать
books.session.commit()

Офлайн

#4 Июнь 20, 2013 12:51:54

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

SQLAlchemy помогите разобратса (на примере)

agryn
Так тоже ничего. Просто забыл дописать
Я имел в виду в методе add



Офлайн

#5 Июнь 20, 2013 17:28:11

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy помогите разобратса (на примере)

plusplus
Я имел в виду в методе add
Ну да! Ночь просто была когда я решил разобратся с sqlalchemy
Вот работоспособный код если кому интересно
import os
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Boolean, ForeignKey
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, relationship
DEFAULT_DIR = ''
SQLITE_DB = 'study_sqlalchemy.sqlite'
sql_uri = "sqlite:///{0}".format(os.path.join(DEFAULT_DIR, SQLITE_DB))
engine = create_engine(sql_uri, echo=False)
Base = declarative_base()
class Books(Base):
    __tablename__ = 'books'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    author = relationship("Author")
class Author(Base):
    __tablename__ = 'author'
    id = Column(Integer, primary_key=True)
    book_id = Column(Integer, ForeignKey('books.id'))
    name = Column(String)
class BookStore:
    def __init__(self):
        self.book_name = ''
        self.book_authors = []
        metadata = Base.metadata
        metadata.create_all(engine)
        Session = sessionmaker(bind=engine)
        self.session = Session()
    def add(self):
        book = Books()
        book.name = self.book_name
        for author_name in self.book_authors:
            author_lst = self.session.query(Author).filter_by(name=author_name)
            #pdb.set_trace()
            if not author_lst.count():
                author = Author()
                author.name = author_name
            else:
                author = author_lst[0]
            book.author.append(author)
        self.session.add(book)
        self.session.commit()
        self.book_name = ''
        self.book_authors = []
if __name__ == '__main__':
    books = BookStore()
    books.book_name = 'Book1'
    books.book_authors = ['Author1', 'Author2']
    books.add()
    books.book_name = 'Book2'
    books.book_authors = ['Author1', 'Author2', 'Author3']
    books.add()


Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version