type one datatypes data column python sql database sqlalchemy

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