SQLAlchemy для новичков
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