Python 使用ORM时的情况(SQLalchemy)

Python 使用ORM时的情况(SQLalchemy),python,orm,sqlalchemy,Python,Orm,Sqlalchemy,我正在使用SQLAlchemy和Paradim。我没有找到一种方法来做一个案例。我在网上找不到这方面的信息 可能吗?请参见文档页面上的函数和更多示例。但它看起来是这样的(从链接到的文档中逐字记录): 编辑-1:(回答评论)当然可以,请参见下面的示例: class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) first_name

我正在使用SQLAlchemy和Paradim。我没有找到一种方法来做一个案例。我在网上找不到这方面的信息

可能吗?

请参见文档页面上的函数和更多示例。但它看起来是这样的(从链接到的文档中逐字记录):

编辑-1:(回答评论)当然可以,请参见下面的示例:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True, autoincrement=True)
    first_name = Column(String)
    last_name = Column(String)

xpr = case([(User.first_name != None, User.first_name + " " + User.last_name),],
        else_ = User.last_name).label("full_name")

qry = session.query(User.id, xpr)
for _usr in qry:
    print _usr.fullname

另请参见混合属性中使用的
案例的示例。

以下是文档中的链接:

但是看到这些例子让我很困惑,而且没有可运行的代码。 我试了很多次,遇到了很多问题

最后,我找到了两种在sqlalchemy中实现“Case-when”的方法

第一种方式:

顺便说一句,我的情况是我需要屏蔽电话字段,这取决于用户是否已登录

    @staticmethod
    def requirement_list_common_query(user=None):
      `enter code here`  phone_mask = case(
            [
                (db.true() if user else db.false(), Requirement.temp_phone),
            ],
            else_=func.concat(func.left(Requirement.temp_phone, 3), '****', func.right(Requirement.temp_phone, 4))
        ).label('temp_phone')
        query = db.session.query(Requirement.company_id,
                                 Company.uuid.label('company_uuid'),
                                 Company.name.label('company_name'),
                                 Requirement.uuid,
                                 Requirement.title,
                                 Requirement.content,
                                 Requirement.level,
                                 Requirement.created_at,
                                 Requirement.published_at,
                                 Requirement.end_at,
                                 Requirement.status,
                                 # Requirement.temp_phone,
                                 phone_mask,
                                 User.name.label('user_name'),
                                 User.uuid.label('user_uuid')
                                 )
        query = query.join(Company, Company.id == Requirement.company_id) \
            .join(User, User.id == Requirement.user_id)
        return query
需求是我的一个模型。 如果用户已登录,则方法“requirement\u list\u common\u query”中的用户参数是已登录的用户

    @staticmethod
    def requirement_list_common_query(user=None):
      `enter code here`  phone_mask = case(
            [
                (db.true() if user else db.false(), Requirement.temp_phone),
            ],
            else_=func.concat(func.left(Requirement.temp_phone, 3), '****', func.right(Requirement.temp_phone, 4))
        ).label('temp_phone')
        query = db.session.query(Requirement.company_id,
                                 Company.uuid.label('company_uuid'),
                                 Company.name.label('company_name'),
                                 Requirement.uuid,
                                 Requirement.title,
                                 Requirement.content,
                                 Requirement.level,
                                 Requirement.created_at,
                                 Requirement.published_at,
                                 Requirement.end_at,
                                 Requirement.status,
                                 # Requirement.temp_phone,
                                 phone_mask,
                                 User.name.label('user_name'),
                                 User.uuid.label('user_uuid')
                                 )
        query = query.join(Company, Company.id == Requirement.company_id) \
            .join(User, User.id == Requirement.user_id)
        return query
第二种方式: 在这里,我想根据员工的收入对他们进行分类

这些模型是:

class Dept(Base):
    __tablename__ = 'dept'
    deptno = Column(Integer, primary_key=True)
    dname = Column(String(14))
    loc = Column(String(13))

    def __repr__(self):
        return str({
            'deptno': self.deptno,
            'dname': self.dname,
            'loc': self.loc
        })


class Emp(Base):
    __tablename__ = 'emp'
    empno = Column(Integer, primary_key=True)
    ename = Column(String(10))
    job = Column(String(9))
    mgr = Column(Integer)
    hiredate = Column(Date)
    sal = Column(DECIMAL(7, 2))
    comm = Column(DECIMAL(7, 2))
    deptno = Column(Integer, ForeignKey('dept.deptno'))

    def __repr__(self):
        return str({
            'empno': self.empno,
            'ename': self.ename,
            'job': self.job,
            'deptno': self.deptno,
            'comm': self.comm
        })
代码如下:

from sqlalchemy import text
income_level = case(
    [
        (text('(emp.sal + ifnull(emp.comm,0))<1500'), 'LOW_INCOME'),
        (text('1500<=(emp.sal + ifnull(emp.comm,0))<3500'), 'MIDDLE_INCOME'),
        (text('(emp.sal + ifnull(emp.comm,0))>=3500'), 'HIGH_INCOME'),
    ], else_='UNKNOWN'
).label('income_level')
emps = sess.query(Emp.ename, label('income', Emp.sal + func.ifnull(Emp.comm, 0)),
                  income_level).all()
for item in emps:
    print(item.ename, item.income, item.income_level)

希望能有帮助

我将其用于聚合函数,在本例中为
func.sum

我的示例代码 我的用例 MyTable如下所示:

|   hit_type     |  success |  
-----------------------------  
|   easy         |   1      |  
|   medium       |   1      |  
|   easy         |   0      |  
|   hard         |   1      |  
|   easy         |   0      |
|   easy         |   1      |  
|   medium       |   1      |  
|   hard         |   1      |
得分
计算如下:
score=num\u easy\u hits+num\u medium\u hits+(3*num\u hard\u hits)


4次成功的简单/中等点击和2次成功的重击将为您提供
(4+(2*3))=10

因此,ORM不可能实现?您可以查看更新的答案,并提供运行良好的示例。谢谢!祝贺文档实现了函数…
NotImplementedError:此表达式不支持运算符“getitem”
如果只有一个when,则需要将其作为iterable传入。当我阅读文档时,我并不清楚这一点,但我从你的回答中发现了这一点。谢谢。这是问题的副本:
from sqlalchemy import func, case

my_case_stmt = case(
    [
        (MyTable.hit_type.in_(['easy', 'medium']), 1),
        (MyTable.hit_type == 'hard', 3)
    ]
)

score = db.session.query(
    func.sum(my_case_stmt)
).filter(
    MyTable.success == 1
)

return score.scalar()
|   hit_type     |  success |  
-----------------------------  
|   easy         |   1      |  
|   medium       |   1      |  
|   easy         |   0      |  
|   hard         |   1      |  
|   easy         |   0      |
|   easy         |   1      |  
|   medium       |   1      |  
|   hard         |   1      |