Sqlalchemy подключение к бд oracle

Обновлено: 04.07.2024

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

На всех наших занятиях этого курса по Flask мы с вами использовали БД SQLite: непосредственно подключались к ней и работали с таблицами через SQL-запросы. Но это не лучшее решение. Для реальных сайтов следует выбирать более функциональные СУБД, рассчитанные на большую нагрузку, когда множество пользователей одновременно могут записывать и читать данные из разных таблиц. Например:

MySQL, PostgreSQL, Oracle и другие.

Причем, разработчик сайта наперед может не знать с какой именно СУБД будет работать WSGI-приложение. Да и потом, уже в процессе работы, выбор может пасть на другой тип БД. Как в этом случае построить универсальную программу не привязанную к конкретной СУБД? В Python часто для этого используют пакет

который является интерфейсом, построенным по технологии ORM (Object Role Model), позволяющий оперировать таблицами БД как объектами языка Python. Причем этот интерфейс универсален и на уровне WSGI-приложения не привязан к конкретной СУБД.


Так вот, для фреймворка Flask разработано специальное расширение:

которое значительно упрощает настройку и использование самого SQLAlchemy. И о нем пойдет речь на этом занятии.

Вначале, как всегда, его нужно установить. Для этого достаточно выполнить команду:

pip install Flask-SQLAlchemy

и он будет готов к использованию. Далее, я создам новый проект, чтобы нам не разбираться в прежнем коде и не тратить на это время. И, к тому же, так будет проще воспринимать этот материал.

Настройка Flask-SQLAlchemy

Первым делом нужно подключить Flask-SQLAlchemy к нашей программе. Для этого выполним его импорт:

и, затем, после создания экземпляра приложения, создадим в конфигурации специальную константу 'SQLALCHEMY_DATABASE_URI':

  • postgresql://user:password@localhost/mydatabase
  • mysql://user:password@localhost/mydatabase
  • oracle://user:password@127.0.0.1:1521/mydatabase

и автоматически к программе подключится указанная СУБД. Как видите, все достаточно просто и удобно.

После настройки конфигурации необходимо создать экземпляр класса SQLAlchemy, через который и осуществляется работа с БД. В самом простом варианте это делается так:

Здесь при создании класса передается ссылка на текущее приложение, с которым он будет связан.

Создание таблиц во Flask-SQLAlchemy

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


Так вот, концепция SQLAlchemy заключается в отображении таблиц с помощью Python-классов. То есть, нам достаточно в программе прописать два класса с именами

Users и Profiles

которые бы расширяли базовый класс модели таблиц:

Сначала определим класс Users (порядок не имеет значения, просто иду по рисунку):

Смотрите, мы здесь указываем базовый класс Model, который и превращает класс Users в модель таблицы для SQLAlchemy. А поля таблицы прописываются как обычные переменные, которые ссылаются на специальный класс Column. Этот класс как раз и указывает SQLAlchemy воспринимать эти переменные как поля таблицы. Причем, имя таблицы будет соответствовать имени класса, записанное малыми буквами, а имена переменных – именам полей в этой таблице. Далее, в конструкторе класса Column мы указываем тип поля и дополнительные параметры. Например, поле id будет создаваться как целочисленное и представлять собой главный ключ (то есть, оно будет принимать уникальное значение для каждой записи). Далее, тип String(50) – это строка максимальной длиной в 50 символов, а параметр unique=True означает, что оно должно быть уникальным среди всех записей данной таблицы. Следующее поле psw также является строкой и параметр nullable=False указывает, что оно должно обязательно содержать данные, т.е. пустым быть не может. Наконец, последнее поле date имеет тип datetime для хранения даты и по умолчанию ему присваивается текущая дата, взятая с помощью функции datetime.utcnow. Выше в программе мы ее импортируем:

В конце описания класса идет «магическая» функция __repr__, которая определяет способ отображения класса в консоли. С ее помощью мы будем выводить класс в виде строки формата:

Она здесь прописана для удобства и к функционированию таблиц не имеет отношения.

По аналогии создается вторая таблица Profiles:

Здесь все достаточно очевидно, только дополнительно прописано целочисленное поле user_id, определенное как внешний ключ. Как раз через него можно будет связывать эти две таблицы, то есть, конкретного пользователя с его профайлом.

  • Integer – целочисленный;
  • String(size) – строка максимальной длиной size;
  • Text – текст (в формате Unicode);
  • DateTime – дата и время представленные в формате объекта datetime;
  • Float – число с плавающей точкой (вещественное);
  • Boolean – логическое значение;
  • LargeBinary – для больших произвольных бинарных данных (например, изображений).

Итак, таблицы определены и теперь можно их создать в БД. Для этого файл (или файлы) БД нужно перенести в какое-либо другое место (или удалить) и, затем, в консоли Python выполнить следующие команды:

from app import db

Здесь app – это название файла, в котором инициализирована переменная db. А метод create_all как раз и создает таблицы, используя классы Users и Profiles.

Добавление записей

Пришло время создать в нашей программе первую функцию представления для регистрации пользователей, где мы могли бы добавлять новые записи в таблицы БД. Вначале пропишем обработчик:

И определим шаблон register.html на основе базового шаблона layout.html:

- layout.html:

- register.html:

Сначала, конечно, идет проверка, что данные переданы методом POST, затем, по идее должна быть проверка корректности заполнения полей формы. Но мы пропустим этот шаг, чтобы не перегружать занятие лишней информацией. И после этого, в блоке try осуществляем работу с БД.

В первую очередь мы создаем экземпляр класса Users и через именованные параметры передаем данные из формы. Причем, именованные параметры должны совпадать с именами переменных, объявленных нами ранее. В результате создается объект с данными по email и паролю, который и представляет собой будущую запись в таблице users.

Далее, чтобы ее добавить, происходит обращение к специальному объекту session – сессии БД и в нее добавляется запись с помощью метода add. В качестве параметра этот метод принимает ссылку на объект класса Users. Но эта запись пока еще хранится в сессии – памяти устройства. Физически в таблицу она не занесена. Поэтому, далее, выполняется метод flush, который из сессии перемещает запись в таблицу. Но пока все изменения происходят в памяти устройства и, физически, файл БД остается прежним. Это необходимо, на случай возникновения исключений (ошибок) и «отката» состояния БД к исходному состоянию с помощью метода rollback.

Если ошибок не возникает, то формируется следующий экземпляр класса Profiles с набором данных из формы и дополнительно берется значение u.id, которое сформировалось после метода flush при помещении записи в таблицу users. Вот именно поэтому мы его и вызывали. Далее, запись помещается в сессию и вызывается метод commit, который уже физически меняет файлы БД и сохраняет изменения в таблицах.

В этой статье мы собираемся посмотреть, как использовать SQLALCHEMY для подключения к ранее существующим базам данных. Если мой опыт какой-либо указания, вы, вероятно, будете проводить больше времени, работая с базами данных, которые вы не создавали, чем с теми, которые вы сделали. Эта статья покажет вам, как подключиться к ним.

SQLalchemy Autoload.

Прежде чем мы начнем, необходимо отметить, что есть два метода настройки SQLALCHEMY: длинновой способ и декларативный (или «сокращение». Мы будем проходить по обоим способам. Давайте начнем с длинной версией, а затем Сделайте это «декларативно».

Это говорит SQLalchemy, чтобы попытаться загрузить таблицу «Moz_Bookbarks» автоматически. Если это правильная база данных с первичным ключом, это будет работать отлично. Если таблица не имеет первичного ключа, то вы можете сделать это, чтобы взломать его:

Это добавляет дополнительную колонку под названием «ID». Это в основном обезьяна для исправления базы данных. Я использовал этот метод успешно, когда мне нужно использовать плохо разработанные базы данных от поставщиков. SQLalchemy автоматически его увеличивает, если база данных поддерживает ее. Mapper будет отображать объект таблицы к классу закладок. Затем мы создаем сеанс, который связан с нашим двигателем, поэтому мы можем сделать запросы. Res = Session.Query (закладки). Все () в основном означает Выберите * от Moz_Bookmarks и вернет результат в виде списка объектов закладки.

Иногда плохая база данных будет иметь поле, которое, очевидно, должно быть первичным ключом. Если это так, вы можете просто использовать это имя вместо «ID». В других случаях вы можете создать уникальный ключ, установив первичную клавишу до двух столбцов (I.E. Поля). Вы делаете это, создавая два столбца и настройка «Private_Key» для TRUE на них обоих. Это намного лучше, чем необходимо определить целую таблицу, если таблица имеет несколько десятков полей.

Давайте перейдем к декларативному методу автозагрузки:

Декларативный метод выглядит немного разным, а? Давайте попробуем распаковать новые вещи. Во-первых, у нас новый импорт: От sqlalchemy.ext.deClarative Import Декларативность_Base Отказ Мы используем «объявление_base», чтобы создать класс, используя наш двигатель, который мы затем создаем подкласс закладок. Чтобы указать имя таблицы, мы используем Magic Method, __tablename__ И чтобы сказать это автозагрузку, мы создаем __table_args__ обдумывать Тогда в нагрузка Функция, мы получаем объект метаданных, как это: метаданные. Метаданные Отказ Остальная часть кода одинакова. Декларативный синтаксис обычно упрощает код, поскольку он помещает все это в один класс, а не создавать класс и объект таблицы отдельно. Если вам нравится декларативный стиль, вы также можете посмотреть Elixir, расширение SQLALCHEMY, который сделал объявление, прежде чем они добавили этот стиль в основной пакет.

Определение ваших баз данных явно

Есть времена, когда вы не можете использовать автозагрузку, или вы просто хотите иметь полный контроль над определением таблицы. SQLalchemy позволяет делать это почти так же легко. Сначала мы посмотрим на версию Longhand, а затем посмотрите на декларативный стиль.

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

Мы немного включили с этим примером, установив его для другой таблицы: «Moz_places». Вы заметите, что вы устанавливаете столбцы здесь, создавая переменные классов. Если вы хотите получить доступ к переменным экземпляра, вам нужно переопределить их в __init__. Если вы этого не сделаете, вы получите довольно красивые проблемы с толку. __Repr__ есть как «симпатичный печать». Когда вы печатаете одно из объектов «Места», вы получите все, что __REPR__ возвращается. Кроме того, код довольно похоже на другие произведения, которые мы видели.

Обертывание

Большинство соединений, которые я вижу, не похожи на тип соединения SQLAlchemy, который я использую. Мне интересно, есть ли способ зеркального отображения этого стиля или он должен быть использован в create_engine. Вот пример моего соединения и класс, который я использую для подключения к определенной таблице:

Моя строка DB URI выглядит следующим образом:

Это хранится в переменной окружения, и я не использую форматирование строк для заполнения этих частей имени пользователя, пароля и т. д. (У меня они жестко закодированы, я просто удалил их по соображениям безопасности)

А теперь класс, с которым я пытаюсь установить связь:

и снова часть таблицы я переименовал из соображений безопасности.

Я попытался присоединить имя схемы также к DB URI, который я храню в своей переменной окружения. Я всегда получаю эту ошибку:

Я очень ценю вашу помощь. Обычно я работаю с postgres, и проект, в который я конвертирую свой обычный метод, использует oracle db.

2 ответа

Я столкнулся с неприятной маленькой проблемой подключения к схеме Oracle через SQLAlchemy с использованием имени службы. Вот мой код в виде скрипта. (предметы между угловыми скобками являются держателями мест для реальных ценностей по соображениям безопасности) from sqlalchemy import create_engine.

Просто используйте <tns alias> вашей базы данных в конце строки SQLALCHEMY_DATABASE_URI , преобразованной в

где mydb предполагается <tns alias> в вашем файле TNSNAMES.ORA , например

Спасибо всем вам за вашу помощь. Я забыл опубликовать это, и я не могу вспомнить, где я это нашел, но вот как я решил эту проблему:

Надеюсь, это поможет.

Похожие вопросы:

Я пытаюсь реинжинирировать существующую схему Oracle в некоторые декларативные модели SQLAlchemy. Моя проблема в том , что когда я использую MetaData.reflect , он не находит таблицы в моей схеме, а.

Я пишу демон, который использую для DB SQLAlchemy. База данных MySQL. Если демон долго простаивает, то соединение разрывается, и я вижу ошибки. Можно ли сделать соединение, которое не может.

Я столкнулся с неприятной маленькой проблемой подключения к схеме Oracle через SQLAlchemy с использованием имени службы. Вот мой код в виде скрипта. (предметы между угловыми скобками являются.

Я пытаюсь получить oracle sqlalchemy dburi, работающий с внешним хранилищем паролей (кошелек Oracle) Я попытался использовать стандартный синтаксис sqlplus для внешнего хранилища паролей, но.

Мне нужно подключиться к существующей базе данных с SQLAlchemy через прокси-сервер. self.DB = < 'drivername': 'oracle', 'host': url, 'port': port, 'username': username, 'password': password.

Во-первых, некоторые предпосылки и описание проблемы : Я должен работать с Oracle DB и должен покрыть его DBAL (SQLAlchemy). Мой местного развития DB, который используется для BDD/ки и т. д.

Читайте также: