orm - tables - sqlalchemy relationship not null
CASO CUANDO con ORM(SQLalchemy) (2)
Aquí está el enlace en el documento: http://docs.sqlalchemy.org/en/latest/core/sqlelement.html?highlight=case#sqlalchemy.sql.expression.Case
pero me confundió ver esos ejemplos, y no hay código ejecutable. Lo he intentado muchas veces y me he encontrado con muchos tipos de problemas.
Finalmente, encontré dos formas de implementar "Caso cuando" dentro de sqlalchemy.
La primera forma:
Por cierto, mi ocasión es cuando necesito enmascarar el campo del teléfono dependiendo de si el usuario ha iniciado sesión.
@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
El requisito es mi uno de mis modelos. el argumento del usuario en el método ''requerimiento_list_common_query'' es el usuario que ha iniciado sesión si el usuario ha iniciado sesión.
la segunda forma: la ocasión aquí es que quiero clasificar a los empleados dependiendo de sus ingresos.
los modelos son:
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
})
Aquí está el código:
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)
¿Por qué usé "texto"? Porque código como este en SQLAlchemy 1.2.8 no se puede implementar. Lo he intentado durante mucho tiempo y no puedo encontrar una manera como esta, como @van ha dicho:
case([(orderline.c.qty > 100, item.c.specialprice),
(orderline.c.qty > 10, item.c.bulkprice)
], else_=item.c.regularprice)
case(value=emp.c.type, whens={
''engineer'': emp.c.salary * 1.1,
''manager'': emp.c.salary * 3,
})
Espero que te ayude!
Estoy usando SQLAlchemy con el ORM paragdim. No consigo encontrar una manera de hacer una instrucción CASE WHEN. No encuentro información sobre esto en la web.
Es posible ?
Consulte la función sqlalchemy.sql.expression.case y más ejemplos en la página de documentación. Pero se vería así (textualmente de la documentación vinculada a):
case([(orderline.c.qty > 100, item.c.specialprice),
(orderline.c.qty > 10, item.c.bulkprice)
], else_=item.c.regularprice)
case(value=emp.c.type, whens={
''engineer'': emp.c.salary * 1.1,
''manager'': emp.c.salary * 3,
})
edit-1 : (respondiendo al comentario) Claro que puedes, mira el siguiente ejemplo:
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
Consulte también Uso de un híbrido para ver un ejemplo de un case
utilizado en las propiedades híbridas.