2016-10-10 2 views
4

Я использую SQLAlchmey как ORM для проекта python. Я создал несколько моделей/схем, и он работает нормально. Теперь мне нужно запросить существующую базу данных mysql, нет вставки/обновления только инструкции select.sqlalchemy существующий запрос базы данных

Как создать оболочку вокруг таблиц этой существующей базы данных? Я кратко просмотрел документы sqlalchemy и SO, но не смог найти ничего подходящего. Все предлагают метод execute, где мне нужно написать сырые запросы sql. Хотя я хочу использовать метод запроса SQLAlchmey так же, как я использую с моделями SA.

Например, если существующая БД имеет таблицы имя пользователя, то я хочу, чтобы запросить его с помощью dbsession (только операции выбора, вероятно, с присоединиться)

+0

Вы бы использовать [отражения] (http://docs.sqlalchemy.org/en/latest/core/reflection.html), и [automap] (http://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html), если вы хотите работать с сопоставленными классами. –

ответ

3

Вы, кажется, создалось впечатление, что SQLAlchemy может работать только с структура базы данных, созданная SQLAlchemy (возможно, с использованием MetaData.create_all()) - это неверно. SQLAlchemy может отлично работать с уже существующей базой данных, вам просто нужно определить ваши модели в соответствии с таблицами базы данных. Один из способов сделать это, чтобы использовать отражение, а Ilja Everilä предлагает:

class MyClass(Base): 
    __table__ = Table('mytable', Base.metadata, 
        autoload=True, autoload_with=some_engine) 

(который, на мой взгляд, было бы совершенно нормально для одноразовых сценариев, но может привести к невероятно разочаровывает ошибок в «реальном» приложение, если есть потенциал, который может изменить структура базы данных с течением времени)

Другой способ - просто определить ваши модели, как обычно, чтобы определить ваши модели в соответствии с таблицами базы данных, что не так сложно. Преимущество этого подхода заключается в том, что вы можете сопоставить только подмножество таблиц базы данных для ваших моделей и даже только подмножество столбцов таблицы для полей вашей модели. Предположим, у вас есть 10 таблиц в базе данных, но только заинтересован в users таблицу из которой вам нужно только id, name и email поля:

class User(Base): 
    id = sa.Column(sa.Integer, primary_key=True) 
    name = sa.Column(sa.String) 
    email = sa.Column(sa.String) 

(обратите внимание, как нам не нужно определить некоторые детали, которые нужны только для испускать правильный DDL, например длину полей String или тот факт, что поле email имеет индекс)

SQLAlchemy не будет генерировать запросы INSERT/UPDATE, если вы не создадите или не измените модели в своем коде. Если вы хотите, чтобы ваши запросы были доступны только для чтения, вы можете создать специального пользователя в базе данных и предоставить только привилегии пользователя SELECT. В качестве альтернативы/кроме того, вы также можете поэкспериментировать с откатом транзакции в коде приложения.

+0

Спасибо, хотя я использовал automap с отражением, но ваше предложение также выглядит хорошо. Для пользователей SO, если у вас есть время, вы можете добавить еще один пример Automap. Это сделает этот ответ полным – DevC

+0

@DevC: спасибо, я добавил пример – Sergey

0

Вы можете получить доступ к существующей таблице, используя следующий код:

from sqlalchemy.orm import Session 

Base = automap_base() 
Base.prepare(engine, reflect=True) 
Users = Base.classes.users 
session = Session(engine) 
res = session.query(Users).first() 
Смежные вопросы