query practices in_ for example best auth and python orm sqlalchemy

python - practices - sqlalchemy models



¿Cómo eliminar filas de una tabla usando una consulta SQLAlchemy sin ORM? (2)

Estoy escribiendo un script de mantenimiento rápido y sucio para eliminar algunas filas y me gustaría evitar tener que traer mis clases / asignaciones ORM del proyecto principal. Tengo una consulta que se parece a:

address_table = Table(''address'',metadata,autoload=True) addresses = session.query(addresses_table).filter(addresses_table.c.retired == 1)

De acuerdo con todo lo que he leído, si estaba usando el ORM (no las tablas ''solo'') y pasaba algo como:

addresses = session.query(Addresses).filter(addresses_table.c.retired == 1)

Podría agregar un .delete() a la consulta, pero cuando intento hacerlo utilizando solo tablas, obtengo una queja:

File "/usr/local/lib/python2.6/dist-packages/sqlalchemy/orm/query.py", line 2146, in delete target_cls = self._mapper_zero().class_ AttributeError: ''NoneType'' object has no attribute ''class_''

Lo que tiene sentido ya que es una mesa, no una clase. Soy bastante verde cuando se trata de SQLAlchemy, ¿cómo debería estar haciendo esto?


Cuando llama a delete() desde un objeto de consulta, SQLAlchemy realiza una eliminación masiva . Y debe elegir una estrategia para eliminar los objetos coincidentes de la sesión . Vea la documentación here .

Si no elige una estrategia para eliminar los objetos coincidentes de la sesión, SQLAlchemy intentará evaluar los criterios de la consulta en Python directamente sobre los objetos de la sesión. Si no se implementa la evaluación de los criterios, se genera un error.

Esto es lo que está sucediendo con su eliminación.

Si solo desea eliminar los registros y no le importan los registros en la sesión después de la eliminación, puede elegir la estrategia que ignora la sincronización de la sesión:

address_table = Table(''address'', metadata, autoload=True) addresses = session.query(address_table).filter(address_table.c.retired == 1) addresses.delete(synchronize_session=False)


Mirando a través de un código donde hice algo similar, creo que esto hará lo que quieras.

d = addresses_table.delete(addresses_table.c.retired == 1) d.execute()

Llamar a delete () en un objeto de tabla le da una expresión sql.expression (si la memoria sirve), que luego ejecuta. He asumido anteriormente que la tabla está vinculada a una conexión, lo que significa que puedes llamar a execute() . Si no, puede pasar la d para execute(d) en una conexión.

Vea los documentos here .