Статьи

Начало работы: SQLAlchemy & NuoDB

Это сообщение от  Люка Баяса из блога NuoDB.

В предыдущей статье Джейкоб обсуждал использование драйвера Python NuoDB для использования возможностей NuoDB в Python. Это круто! Однако, хотя драйвер python полностью способен, для многих разработчиков взаимодействие с базой данных с помощью собственного SQL (1) создает проблемы безопасности, а (2) нарушает структуру в отношении объектно-ориентированной абстракции и дизайна.

В этой статье мы поговорим о SQLAlchemy , популярном объектно-реляционном картографе (ORM) для Python и о том, как его можно использовать для взаимодействия с NuoDB .

Я предполагаю общее знакомство и комфорт с Python. Вот повестка дня:

  1. Введение в объектно-реляционные картографы
  2. Установка модуля sqlalchemy_nuodb
  3. Примеры кода

Давайте начнем.

Вступление

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

Итак, вы — разработчик Python, который хочет создавать масштабируемые облачные решения, возможно, следующее веб-приложение Facebook , которое будет обрабатывать сотни, возможно, тысячи запросов в секунду. Вам нужно, чтобы ваша база данных легко масштабировалась в зависимости от спроса при сохранении производительности (низкая задержка) и вы хотите использовать Python ORM. Это много. Я рад объявить о превосходном решении, SQLAlchemy, самой популярной ORM на основе Python в сочетании с NuoDB, масштабируемым, высокопроизводительным, гибким облачным решением для базы данных.

Давайте настроим все.

Установка

Прежде чем мы сможем установить модуль sqlalchemy_nuodb, модуль sqlalchemy должен быть установлен в нашей системе.

pip install sqlalchemy

Установка sqlalchemy_nuodb может быть выполнена в три этапа:

Шаг 1 — клонировать репо из GitHub

git clone https://github.com/nuodb/nuodb-sqlalchemy

Шаг 2 — смени каталог

cd nuodb-sqlalchemy

Шаг 3 — выполнить команду make

make install

Вот и все. Теперь у вас есть возможности NuoDB и SQLAlchemy!

Теперь давайте использовать его в нескольких примерах

Образцы кода

Для начала нам нужно импортировать модуль sqlalchemy_nuodb

import sqlalchemy_nuodb

Далее нам нужно создать маппер, который является объектным представлением таблицы в нашей базе данных NuoDB. Предполагая, что вы используете базу данных быстрого запуска NuoDB , давайте создадим маппер для таблицы `hockey`.

В nuosql описывается хоккейная таблица:

SQL> show hockey;

	Found table HOCKEY in schema HOCKEY

		ID integer
		NUMBER integer
		NAME string
		POSITION string
		TEAM string

		Index: HOCKEY..PRIMARY_KEY
			ID
		Index: PLAYER_IDX
			NUMBER
			NAME
			TEAM

	Domain HOCKEY not found anywhere!

	Sequence HOCKEY not found anywhere!

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

class Hockey(Base):
    __tablename__ = 'hockey'

    id          = Column(Integer, primary_key=True)
    number      = Column(Integer)
    name        = Column(String)
    position    = Column(String)
    team        = Column(String)
    
    def __init__(self, id, number, name, position, team):
        self.id         = id
        self.number     = number
        self.name       = name
        self.position   = position
        self.team       = team

Это оно! Класс Hockey теперь отображается на таблицу Hockey в NuoDB. Обратите внимание, что мы сопоставляем каждый из столбцов таблицы `hockey` с атрибутом класса Hockey. Мы также определяем таблицу, к которой этот класс соответствует, с __tablename__

Давайте соединим все это в рабочем примере, чтобы распечатать все записи строк в хоккейной таблице.

import sqlalchemy_nuodb

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

# perform simple query
engine = create_engine("nuodb://dba:goalie@localhost:48004/test?schema=hockey", echo=True)
    
# do same as above declaratively
Base = declarative_base()

# define hockey object
class Hockey(Base):
    __tablename__ = 'hockey'

    id          = Column(Integer, primary_key=True)
    number      = Column(Integer)
    name        = Column(String)
    position    = Column(String)
    team        = Column(String)
    
    def __init__(self, id, number, name, position, team):
        self.id         = id
        self.number     = number
        self.name       = name
        self.position   = position
        self.team       = team

    def __repr__(self):
        return "" % (self.id, self.number, self.name, self.position, self.team)

# bind to previously created engine & create a session
Session = sessionmaker(bind=engine)
session = Session()

# print each row
for row in session.query(Hockey).all():
    print row

Давайте обновим Fan # 1, продемонстрированный в этом рабочем примере.

import sqlalchemy_nuodb

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

# perform simple query
engine = create_engine("nuodb://dba:goalie@localhost:48004/test?schema=hockey", echo=True)
    
# do same as above declaratively
Base = declarative_base()

# define hockey object
class Hockey(Base):
    __tablename__ = 'hockey'

    id          = Column(Integer, primary_key=True)
    number      = Column(Integer)
    name        = Column(String)
    position    = Column(String)
    team        = Column(String)
    
    def __init__(self, id, number, name, position, team):
        self.id         = id
        self.number     = number
        self.name       = name
        self.position   = position
        self.team       = team

    def __repr__(self):
        return "" % (self.id, self.number, self.name, self.position, self.team)

# bind to previously created engine & create a session
Session = sessionmaker(bind=engine)
session = Session()

# print each row
for row in session.query(Hockey).all():
    print row

hockey = session.query(Hockey).get(24)
hockey.name = 'JOHN SMITH'

session.commit()

for row in session.query(Hockey).all():
    print row

Резюме

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

Для получения дополнительной информации о SQLAlchemy я настоятельно рекомендую проверить их сайт , он хорошо документирован и имеет отличные примеры для выполнения более сложных запросов.

Кроме того, первый рабочий пример, описанный в этом посте, доступен на GitHub.

Удачного кодирования!