2016-04-05 16 views
0

Dize sütunu olan bir tablo var ancak yalnızca tamsayıları (dizeler olarak) tutar.SQLAlchemy order_by dize sütunu int değerleriyle

Belirli bir sorguda bu sütunda sipariş vermek istediğimde sorun geliyor. SQLAlchemy (veya piton daha spesifik) dizeleri lexicographic düzeni kullanır, böylece

>>> '100000' < '99999' 
True 

bile

>>> 100000 < 99999 
False 

Nasıl bu dize sütunun bir sayısal değer order_by için elde edebilirsiniz?

Şu anda bu gibi bir sorgu vardır:

session.query(TableName).filter(TableName.column == 'some_value').order_by(TableName.string_column_holding_integers).all() 

bir tamsayıya sütun türünü değiştirmek bir seçenek değildir akla Lütfen ben mevcut (sayısal değer) doğru order_by gerek koşullar.

Ayrıca sadece doğrudan SQL kullanarak SQL (bu bir MySQL DB'dir) bu sütuna göre düzgün sipariş veremedim, bu yüzden bir CAST (string_column_holding_integers AS imzasız) kullanarak burada çalıştığını bulundu. Ancak, bunu SQLAlchemy sorgularında doğrudan (CAST kısmı) yapmak için bir yol bulamadı.

cevap

1

Böyle sqlalchemy bir cast yapabilirsiniz: Sütun numaraları ve dizeleri hem içeriyor

session.query(...).filter(...).order_by(cast(TableName.string_column_holding_integers, Integer)) 
+0

ne olur? hala doğru bir siparişi nasıl koruyabilirim? –

+0

@Ricky Bu mümkün değil. Bir sütundaki tüm değerler aynı türde olmalıdır. – univerio

+0

PostgressSQL'de, yani şunu yapabilirsiniz: SIPARIŞ NULLIF (regexp_replace (my_column_1, E '\\ D', '', 'g'), '') :: int (değer INT değilse - göz ardı eder ve devam eder) Bu şekilde, sayısal değerleri doğru bir şekilde sipariş edebilir ve her zamanki gibi dizelerle devam edebiliriz, que - SQLAlchemy'de bunu nasıl yapıyoruz –