Skip to content

Instantly share code, notes, and snippets.

@denisdubovitskiy
Last active July 11, 2017 13:00
Show Gist options
  • Select an option

  • Save denisdubovitskiy/646004a526b7c58288b8e650db9dc0c5 to your computer and use it in GitHub Desktop.

Select an option

Save denisdubovitskiy/646004a526b7c58288b8e650db9dc0c5 to your computer and use it in GitHub Desktop.

Описание задачи

Нужно, используя SQLAlchemy, написать несколько функций, выполняющих роль CRUD (создание, чтение, обновление, удаление).

Пример модели post:

id: integer (primary key) - идентификатор записи, генерится автоматом в СУБД

title: varchar - заголовок поста, обязательное поле body: varchar - текст поста

Пример описания с помощью SQLAlchemy:

class Post(Base):
    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(Unicode, nullable=False)
    body = Column(Unicode, nullable=False)

Как получить сессию и базовую модель см. доку по алхимии. Ей же можно создавать и удалять таблицы.

Теперь, когда есть модель, нужно написать сами функции оперирования данными:

Предлагаю начать с создания:

def create_post(title: str, body:str) -> Post:
    """Your own implementation"""

Пример:

post = create_post('Hey, guys!', 'A long text')

# Adding post to the session
session.add(post)
try:
    # trying to flush the post to the database 
    session.commit()
except SQLAlchemyError as e:
    # rolling the session back in order to prevent updates
    session.rollback()
    raise e

Чтение поста, если есть идентификатор:

def get_post(id: int) -> Post or None:
    """Your own implementation"""
   
post = get_post(1)  # post or None

Фильтрация постов по параметрам: **kwargs может не быть, могут быть аттрибуты, которых нет в самой модели, рекомендую пользоваться hasattr(), getattr() и setattr()

def get_post_list(**kwargs):
    """Your own implementation"""

filtered_posts = get_post_list(title='y, guys')
# strings may use LIKE or ILIKE SQL statements
# integers should be compared equally

Обновление поста:

Алгоритм: пробежаться по **kwargs и обновить аттрибуты модели В **kwargs может находиться все, что угодно, так что рекомендую также пользоваться hasattr(), getattr() и setattr()

def update_post(post: Post, **kwargs) -> Post:
    """Your own implementation"""
    
post = get_post(1)
post = update_post(post, title='Hey, girls!')
try:
    # you don't need to add existing post to the session
    session.commit()
...

Удаление поста:

Алгоритм: найти пост, удалить его через сессию

post = get_post(1)
def delete_post(post):
    """Your own implementation"""
try:
    session.commit()
...

Ради интереса спортивного, можно написать CLI-утилиту, позволяющую управлять всем вышенаписанным из консоли (http://click.pocoo.org/5/)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment