alp*_*ric 3 python sql orm session sqlalchemy
随着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
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对象还是对象列表?
您可以使用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注入。