python - one - sqlalchemy documentation
Seleccione valores NULL en SQLAlchemy (3)
(como lo indica @augurar ): como sqlalchemy usa métodos mágicos (sobrecarga del operador) para crear construcciones de SQL
, solo puede manejar operadores como !=
o ==
, pero no puede trabajar con is
(que es un Python muy válido construir).
Por lo tanto, para que funcione con sqlalchemy, en lugar de:
...filter(or_(people.marriage_status!=''married'', people.marriage_status is None))
Deberías usar:
...filter(or_(people.marriage_status!=''married'', people.marriage_status == None))
, básicamente reemplace el is None
con == None
. En este caso, su consulta se traducirá correctamente al siguiente SQL:
SELECT people.name AS people_name, people.marriage_status AS people_marriage_status
FROM people
WHERE people.marriage_status IS NULL OR people.marriage_status != ?
Ver IS NULL
en la documentation .
Aquí está mi tabla (PostgreSQL) -
test=> create table people (name varchar primary key,
marriage_status varchar) ;
test=> insert into people values (''Ken'', ''married'');
test=> insert into people values (''May'', ''single'');
test=> insert into people values (''Joe'', NULL);
Quiero seleccionar a todas las personas de las que no se sabe que estén casadas, es decir, incluidas las que tienen el estado NULLriage_status
Esto no funciona -
test=> select * from people where marriage_status != ''married'' ;
name | marriage_status
------+-----------------
May | single
(1 row)
Por supuesto que esto hace ...
test=> select * from people where marriage_status != ''married''
or marriage_status is NULL ;
name | marriage_status
------+-----------------
May | single
Joe |
El problema es que estoy accediendo desde SQLAlchemy con -
...filter(or_(people.marriage_status!=''married'',
people.marriage_status is None))
que se traduce a
SELECT people.name as name,
people.marriage_status as marriage_status
FROM people
WHERE people.marriage_status != %(status_1)s OR False
sqlalchemy.engine.base.Engine.... {''status_1'': ''married''}
Y no funciona -
test=> select * from people where marriage_status != ''married''
or False;
name | marriage_status
------+-----------------
May | single
(1 row)
tampoco lo hace --
test=> select * from people where marriage_status != ''married''
or NULL;
name | marriage_status
------+-----------------
May | single
(1 row)
¿Cómo debo seleccionar valores NULL a través de SQLAlchemy?
Desde SQLAlchemy 0.7.9 puede usar el método is_
de la columna.
Una expresión de filtro como:
filter(or_(people.marriage_status!=''married'', people.marriage_status.is_(None)))
generará el SQL parametrizado:
WHERE people.marriage_status != %(status_1)s OR people.marriage_status IS NULL
me encontré con un problema similar
https://groups.google.com/forum/?fromgroups#!topic/sqlalchemy/EVpxsNp5Ifg%5B1-25%5D
respuesta corta: - no hay un operador de columna para IS (NOT) NULL ahora, pero habrá
Mientras tanto, puedes usar:
filter (tablename.is_deleted.op ("IS NOT") (True))
filter (coalesce (tablename.is_deleted, False)! = True)