2017-01-18 2 views
0

С Parent и Child таблицы:Как запросить с сырым SQL с помощью сеанса или двигатель

from sqlalchemy import Column, ForeignKey, String, create_engine, desc, asc 
from sqlalchemy.ext.declarative import declarative_base 
import uuid 

Base = declarative_base() 
class Parent(Base): 
    __tablename__ = 'parents' 
    uuid = Column(String(64), primary_key=True, unique=True) 
    def __init__(self): 
     self.uuid = uuid.uuid4() 

class Child(Base): 
    __tablename__ = 'children' 
    uuid = Column(String(64), primary_key=True, unique=True) 
    parent_uuid = Column(String(64), ForeignKey('parents.uuid')) 
    def __init__(self, parent_uuid=None): 
     self.uuid = uuid.uuid4() 
     self.parent_uuid = parent_uuid 

Я могу идти вперед и создать Parent объект:

engine = create_engine('mysql://root:[email protected]/dbname', echo=False) 
session = scoped_session(sessionmaker()) 
session.remove() 
session.configure(bind=engine, autoflush=False, expire_on_commit=False) 

parent = Parent() 
session.add(parent) 
session.commit() 
session.close() 

В результате parent переменная является регулярным Объект ORM Python.

Если бы я запрос к базе данных вместо создания одного результатом запроса будет список объектов ORM:

result = session.query(Parent).order_by(desc(Parent.uuid)).all() 

Но бывают случаи, когда необходимо запрашивать базу данных с использованием сырой команды Sql. Есть ли способ запустить необработанную команду SQL с использованием объекта session, чтобы гарантировать, что результирующий запрос является объектом ORM или списком объектов?

ответ

1

Вы можете использовать execute() метод сессии:

session.execute('select * from table') 

документация Метод Execute можно найти здесь:

http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.execute

Обратите внимание, это не защищает от SQL инъекций.

+0

'result = engine.execute ('SELECT * FROM parents'). Fetchall()'? Но это вернет список объектов ResultProxy ... – alphanumeric

+0

Вы можете перебирать объекты ResultProxy по очереди с циклом for на ResultProxy, как описано в разделе ** Основное использование ** на этой странице: http : //docs.sqlalchemy.org/en/latest/core/connections.html –