SQLAlchemy для новичков

12 Апр 2017 , 3990

SQLAlchemy — это программная библиотека на языке Python для работы с реляционными СУБД с применением технологии ORM. В данной статье мы рассмотрим , что такое SQLAlchemy , опишем с помощью нее таблицы и реализуем запросы извлечения и записи данных.

Для чего нам необходим SQLAlchemy?

Мы можем описать структуры базы данных и взаимодействовать с ними с помощью языка Python. Это позволяет нам не писать голые SQL-запросы , что свою очередь позволяет повысить читабельность кода и нам не придется задумываться об экранировании , что свою очередь позволяет защититься от SQL-инъекций.

И еще благодаря SQLAlchemy мы можем использовать различные СУБД(Mysql, PostgreSQL)

Сначала установим саму библиотеку:


pip install SQLAlchemy

Если вы в качестве базы данных используете PostgreSQL , то должны установить драйвер psycopg2


pip install psycopg2

Напишем простой скрипт, который подключается к базе данных, определим таблицу Post, сохраним пару записей и выведем их.

В качестве базы данных я использую PostgreSQL. но вы можете использовать MySQL, SQLite или другие базы данных. Единственное что вам нужно будет поменять настройки подключения к базе данных , а остальной код будет работать без изменения

Определим словарь DATABASES с настройками подключения


DATABASE = {
    'drivername': 'postgres', #Тут можно использовать MySQL или другой драйвер
    'host': 'localhost',
    'port': '5432',
    'username': 'youuser',
    'password': 'youpassword',
    'database': 'youdb'
}

Подключаемся к БД (В нашем случае PostgreSQL)


from sqlalchemy import create_engine
from sqlalchemy.engine.url import URL
engine  = create_engine(URL(**DATABASE))

Это аналогично :


from sqlalchemy import create_engine
# по умолчанию вариант
engine  = create_engine('postgres://youuser:youpassword@localhost:5432/youdb')

# При использовании psycopg2
engine = create_engine('postgresql+psycopg2://youuser:youpassword@localhost/youdb')

Далее , нам необходимо декларировать таблицу


from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base

DeclarativeBase = declarative_base()


class Post(DeclarativeBase):
    __tablename__ = 'posts'

    id = Column(Integer, primary_key=True)
    name = Column('name', String)
    url = Column('url', String)

    def __repr__(self):
        return "".format(self.code)

Теперь создадим главную функцию, которая будет вызываться при запуске скрипта и там подключимся к SQLAlchemy.


from sqlalchemy.orm import sessionmaker


def main():
    #Создаем объект Engine, который будет использоваться объектами ниже для связи с БД
    engine = create_engine(URL(**DATABASE))
    #Метод create_all создает таблицы в БД , определенные с помощью  DeclarativeBase
    DeclarativeBase.metadata.create_all(engine)
    # Создаем фабрику для создания экземпляров Session. Для создания фабрики в аргументе 
    # bind передаем объект engine
    Session = sessionmaker(bind=engine)
    # Создаем объект сессии из вышесозданной фабрики Session
    session = Session()

if __name__ == "__main__":
    main()

Строчка DeclarativeBase.metadata.create_all(engine) создает таблицы в базе данных определенные в коде. Они создаются в том случае, если их нет в БД. В нашем случае создается таблица posts в базе данных SQLite, так как мы выше определили класс Post наследуемый от DeclarativeBase и который определяет поля для таблицы posts .

sessionmaker вызовет для нас создание фабрики, которой мы пропишем имя Session. Мы настраиваем фабрику , передавая ей Engine для соединения с ресурсами. Engine мы передаем ей с помощью атрибута bind. После создания фабрики мы можем создать ей экземпляр сессии следующим кодам session = Session(). Далее мы можем использовать сессию для добавления данных в БД.

Теперь попробуем записать в нашу таблицу первую запись.


#Создаем новую запись.
new_post = Post(name='Two record', url="http://testsite.ru/first_record")
# Добавляем запись
session.add(new_post)

#А теперь попробуем вывести все посты , которые есть в нашей таблице
for post in session.query(Post):
    print(post)

Все прекрасно работает. Мы добавляем новый пост и он выводится при запросе. Но если мы посмотрим в саму базу данных . то заметим , что таблица пустая и никакие записи туда не добавляются.Чтобы наша запись добавилась в таблице в базе данных , то нам нужно дописать следующую строчку


#Создаем новую запись.
new_post = Post(name='Two record', url="http://testsite.ru/first_record")
# Добавляем запись
session.add(new_post)
#Благодаря этой строчке мы добавляем данные а таблицу
session.commit()
#А теперь попробуем вывести все посты , которые есть в нашей таблице
for post in session.query(Post):
    print(post)

Подробнее остановимся на строчке session.commit() , которая применяет все изменения в базу данных и фиксирует все транзакции.Если транзакция не выполняется то вызывается InvalidRequestError. После выполнения данного метода начинается новая транзакция

Полный листинг кода:


from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base

DeclarativeBase = declarative_base()


class Post(DeclarativeBase):
    __tablename__ = 'posts'

    id = Column(Integer, primary_key=True)
    name = Column('name', String)
    url = Column('url', String)

    def __repr__(self):
        return "".format(self.code)


def main():
    #Создаем объект Engine, который будет использоваться объектами ниже для связи с БД
    engine = create_engine(URL(**DATABASE))
    
    #Метод create_all создает таблицы в БД , определенные с помощью  DeclarativeBase
    DeclarativeBase.metadata.create_all(engine)
    
    # Создаем фабрику для создания экземпляров Session. Для создания фабрики в аргументе 
    # bind передаем объект engine
    Session = sessionmaker(bind=engine)
    
    # Создаем объект сессии из вышесозданной фабрики Session
    session = Session()

    #Создаем новую запись.
    new_post = Post(name='Two record', url="http://testsite.ru/first_record")
    
    # Добавляем запись
    session.add(new_post)
    
    #Благодаря этой строчке мы добавляем данные а таблицу
    session.commit()
    
    #А теперь попробуем вывести все посты , которые есть в нашей таблице
    for post in session.query(Post):
        print(post)

if __name__ == "__main__":
    main()

Заключение

Это была вводная статья , где мы рассмотрели как подключиться к базе данных используя SQLAlchemy , а также определили таблицу и добавили в эту таблицу несколько строк , но при этом не написали ни одну строчку SQL, а все сделали с помощью кода Python

comments powered by Disqus

Подписка

Подпишитесь на наш список рассылки, чтобы получать обновления из блога

Рубрики

Теги