如何使用Session或Engine查询原始SQL

alp*_*ric 3 python sql orm session sqlalchemy

随着ParentChild表:

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
Run Code Online (Sandbox Code Playgroud)

我可以继续创建一个Parent实体:

engine = create_engine('mysql://root:pass@localhost/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()
Run Code Online (Sandbox Code Playgroud)

结果parent变量是常规的Python ORM对象。

如果我查询一个数据库而不是创建一个数据库,查询结果将是一个ORM对象列表:

result = session.query(Parent).order_by(desc(Parent.uuid)).all()
Run Code Online (Sandbox Code Playgroud)

但是有时我们需要使用原始Sql命令查询数据库。有没有一种方法可以使用sessionobject 运行原始SQL命令,以确保生成的查询返回是ORM对象还是对象列表?

the*_*ant 5

您可以使用execute()Session方法:

session.execute('select * from table')
Run Code Online (Sandbox Code Playgroud)

可以在这里找到execute方法的文档:

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

请注意,这不能防止SQL注入。