2010-11-06 18 views
20

¿Es posible usar una expresión regular de forma similar a session.query(MyObject).filter_by(REGEX)?Expresiones regulares en SQLalchemy consultas?

En caso negativo, ¿cómo puedo usar sqlAlchemy para recuperar registros que tienen un PK varchar que comienza con un cierto valor (por ejemplo, todos aquellos cuyo campo city comienza con "SA")? Gracias.

+1

Si se utiliza Oracle, tendrá que utilizar esta respuesta http://stackoverflow.com/a/14750641/269834 –

Respuesta

23

creo que lo tengo:

session.query(Object).filter(Object.column.op('regexp')(REGEX)) 
+8

Esta respuesta solo funcionará en MySQL, que usa 'REGEXP' como operador de comparación. Tendrá que cambiarlo en otras bases de datos, y solo funcionará así si la base de datos tiene un operador de comparación de expresiones regulares (a diferencia de, por ejemplo, una función). En PostgreSQL, puede usar 'op ('~')'. –

3

[RENUNCIA: sin expresiones regulares]

Estoy respondiendo a la pregunta "¿cómo puedo usar sqlalchemy para recuperar registros que tienen un PK varchar a partir de un cierto valor" ya que por este simple caso de uso de un LIKE probablemente es a la vez menos costoso y más portátil (pedir expresiones regulares parece una manifestación de the XY Problem).

En SQLAlquemy (préstamos de Alex):

session.query(Object).filter(Object.column.like('something%')) 

En SqlSoup usar:

db.table.filter(db.table.column.like('something%')) 
+2

Por qué la downvote? Una expresión regular es claramente excesiva para probar una cadena que comienza con "algo". Además, no todas las bases de datos tienen soporte nativo de expresiones regulares, pero cada base de datos SQL admite sentencias "como": las operaciones del lado del servidor son siempre mejores. –

+0

Porque "me gusta" es mucho menos poderoso que regexp ... – Sylvestre

+1

@Sylvestre ... y mucho más costoso y menos portátil. –

3

Para el registro, se puede hacer esencialmente la misma sintaxis que la respuesta de Paulo Scardine en SQLAlchemy también;

session.query(Object).filter(Object.column.like('something%')) 
+0

¿Por qué el voto a favor? * Literalmente * todo lo que hago es proporcionar una traducción SQLAlchemy para describir otra respuesta. No pretendo que sea mejor, ni siquiera que la respuesta que estoy traduciendo sea la mejor. Si hay algo mal comente y corrija (y puede haberlo), ¡pero no abandone arbitrariamente! – Alex

+1

Este es un 'me gusta', no un 'regex' como se solicita en la pregunta. –

Cuestiones relacionadas