SQLAlchemy

时间:2016-01-26 11:40:23

标签: python-3.x sqlalchemy

我在学习SQLAlchemy只有两天时间,并且对列名称的映射有疑问。首先,官方文档中的以下声明使我失去平衡:

  

匹配列上的列适用于简单的情况,但可以成为   处理包含重复的复杂语句时难以处理   列名称或使用不容易的匿名ORM构造时   匹配特定的名称。此外,还有打字行为   出现在我们可能认为必要的映射列中   处理结果行。

呃,什么?!本段试图说的一个或两个例子很棒,但没关系;这是另一天的任务。

我有点明白,有时我们的查询生成的字段列表不会与模型完美映射,因此我们可以在位置上指定预期的列。这让我想到了这个映射可能有用的例子。所以我想,如何从表格中选择一个即时计算的列?我使用sqlite函数在random()数据库中对此进行了模拟,如下所示:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()

Session = sessionmaker(bind=engine)
session = Session()

class User(Base):
    __tablename__ = 'users'
    id       = Column(Integer, primary_key=True)
    name     = Column(String)
    fullname = Column(String)
    password = Column(String)

    def __repr__(self):
        return "User<name={}, fullname={}, password={}>".format(self.name, self.fullname, self.password)

# Create all tables
Base.metadata.create_all(engine)

ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)
session.add_all([
    User(name='wendy', fullname='Wendy Williams', password='foobar'),
    User(name='mary', fullname='Mary Contrary', password='xxg527'),
    User(name='fred', fullname='Fred Flinstone', password='blah')
])
session.commit()

stmt = text("SELECT name, id, fullname, random() FROM users WHERE name=:name")
stmt = stmt.columns(User.name, User.id, User.fullname ...

现在怎样?我无法编写列名,因为它们不存在,我无法将其添加到模型定义中,因为此列将不必要地创建。我只想从数据库中获取一些额外的信息(如NOW()),我可以在代码中使用。

如何做到这一点?

3 个答案:

答案 0 :(得分:1)

您可以使用column labels

from sqlalchemy import func

users = session.query(User.id, User.name, User.fullname, func.random().label('random_value'))
for user in users:
    print(user.id, user.name, user.fullname, user.random_value)

答案 1 :(得分:0)

好吧,所以我似乎已经弄明白了(该死的,一天两次!这里的SQLAlchemy社区似乎已经死了,这迫使我自己寻找答案......不是很好不好的事,但是!)。以下是我的表现方式:

from sqlalchemy import func
session.query(User.name, User.id, User.fullname, func.current_timestamp()).filter(User.name=='ed').all()

答案 2 :(得分:0)

尝试明确列出CLONE个对象。这种方式&#34; random()&#34;可以是任意SQL计算列...

column