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ı.
ne olur? hala doğru bir siparişi nasıl koruyabilirim? –
@Ricky Bu mümkün değil. Bir sütundaki tüm değerler aynı türde olmalıdır. – univerio
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 –