¿Cómo pasar 2 condiciones a donde cláusula en sqlalchemy?
Me gustaría pasar dos where
condiciones para where clause
dentro sqlalchemy
. Sin embargo, lanzó diferentes tipos de error
. Cuando uso ',' en return self._get_jobs
, me advirtió que sólo acepta 2 parámetro. También intenté convertirlos en Strings, pero no trabajo. Los siguientes son mi código y juicio. ¿Cómo puedo resolverlo? Salud.
Código:
def get_due_jobs(self, now):
timestamp = datetime_to_utc_timestamp(now)
return self._get_jobs(self.next_run_time <= timestamp and self.jobs_t.c.name = self.name)
def _get_jobs(self, *conditions):
jobs = []
selectable = select([self.jobs_t.c.id, self.jobs_t.c.job_state]).\
order_by(self.jobs_t.c.next_run_time)
selectable = selectable.where(*conditions) if conditions else selectable
failed_job_ids = set()
for row in self.engine.execute(selectable):
try:
jobs.append(self._reconstitute_job(row.job_state))
except BaseException:
self._logger.exception('Unable to restore job "%s" -- removing it', row.id)
failed_job_ids.add(row.id)
# Remove all the jobs we failed to restore
if failed_job_ids:
delete = self.jobs_t.delete().where(self.jobs_t.c.id.in_(failed_job_ids))
self.engine.execute(delete)
return jobs
Lo que intenté es convertirlos en Strings:
def get_due_jobs(self, now):
timestamp = datetime_to_utc_timestamp(now)
return self._get_jobs(f"{self.next_run_time} <= {timestamp} and {self.jobs_t.c.name} = {self.name}")
def _get_jobs(self, *conditions):
jobs = []
selectable = select([self.jobs_t.c.id, self.jobs_t.c.job_state]).\
order_by(self.jobs_t.c.next_run_time)
selectable = selectable.where(text(*conditions)) if conditions else selectable
Pregunta hecha hace 3 años, 4 meses, 28 días - Por devguru123
2 Respuestas:
-
Para pasar dos condiciones a la cláusula
where
en SQLAlchemy, puedes crear cada condición por separado y luego combinarlas utilizando el operadorand
oor
según sea necesario. Aquí te muestro cómo puedes hacerlo en tu código:- Define las dos condiciones por separado en la función `get_due_jobs`:
python def get_due_jobs(self, now): timestamp = datetime_to_utc_timestamp(now) condition1 = self.next_run_time <= timestamp condition2 = self.jobs_t.c.name == self.name return self._get_jobs(condition1, condition2)
- En la función `_get_jobs`, actualiza la lógica para construir la consulta combinando las condiciones:
python def _get_jobs(self, conditions): jobs = [] selectable = select([self.jobs_t.c.id, self.jobs_t.c.job_state]).\ order_by(self.jobs_t.c.next_run_time) combined_condition = and_(conditions) if conditions else None selectable = selectable.where(combined_condition)
Al utilizar la función
and_
proporcionada por SQLAlchemy, puedes combinar varias condiciones lógicas para crear una única condición que se puede pasar a la cláusulawhere
de la consulta.Espero que esta solución te ayude a resolver el problema que estás enfrentando al pasar múltiples condiciones a la cláusula
where
en SQLAlchemy. ¡Déjame saber si necesitas más ayuda!Respondida el Dec 19, 2020 a las 08:33 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para pasar múltiples condiciones a una cláusula
WHERE
en SQLAlchemy, puedes usar el métodoand_
oor_
. El métodoand_
combina múltiples condiciones con un operadorAND
, mientras que el métodoor_
las combina con un operadorOR
.En tu caso, puedes usar el método
and_
para combinar las dos condiciones:python def get_due_jobs(self, now): timestamp = datetime_to_utc_timestamp(now) return self._get_jobs( and_(self.next_run_time <= timestamp, self.jobs_t.c.name == self.name) )
También puedes usar la función
text
para pasar una cadena de consulta sin procesar como condición:python def get_due_jobs(self, now): timestamp = datetime_to_utc_timestamp(now) return self._get_jobs( text(f"{self.next_run_time} <= {timestamp} AND {self.jobs_t.c.name} = {self.name}") )
Sin embargo, se recomienda utilizar el método
and_
oor_
para mayor claridad y mantenibilidad.Respondida el Dec 19, 2020 a las 08:39 - por Gemini
Votos positivos: 0 | Votos negativos: 0