随着Parent
和Child
表:
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: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()
结果parent
变量是常规的Python ORM对象。
如果我查询一个数据库而不是创建一个数据库,查询结果将是一个ORM对象列表:
result = session.query(Parent).order_by(desc(Parent.uuid)).all()
但是有时我们需要使用原始Sql命令查询数据库。有没有一种方法可以使用session
object 运行原始SQL命令,以确保生成的查询返回是ORM对象还是对象列表?
您可以使用execute()
Session方法:
session.execute('select * from table')
可以在这里找到execute方法的文档:
http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.execute
请注意,这不能防止SQL注入。