2013-10-11 13 views
10

SQLAlchemy connection.execute (sql) kullanarak, seçilen sonuçları haritaların dizisine dönüştürmek için kullanıyorum. Aşağıdaki kodPython, SQLAlchemy bağlantı parametreleri.execute


def __sql_to_data(sql): 
    result = [] 
    connection = engine.connect() 
    try: 
     rows = connection.execute(sql) 
     for row in rows: 
      result_row = {} 
      for col in row.keys(): 
       result_row[str(col)] = str(row[col]) 
      result.append(result_row) 
    finally: 
     connection.close() 
    return result 

ve benzeri.

__sql_to_data(sql_get_scan_candidate)
bana güzel veri yapısı sağlıyor (Tabii ki bunu küçük veri kümeleri için kullanıyorum). Ancak sql'ye parametre eklemek için şu anda formatı kullanıyorum: ör.

return __sql_to_data(sql_get_profile,user_id)

cevap

22

The tutorial gibi olası bir şey yapmak için prosedür nasıl değiştirilir

return __sql_to_data(sql_get_profile.format(user_id))

Soru bunun için oldukça iyi bir örnek verir:

>>> from sqlalchemy.sql import text 
>>> s = text(
...  "SELECT users.fullname || ', ' || addresses.email_address AS title " 
...   "FROM users, addresses " 
...   "WHERE users.id = addresses.user_id " 
...   "AND users.name BETWEEN :x AND :y " 
...   "AND (addresses.email_address LIKE :e1 " 
...    "OR addresses.email_address LIKE :e2)") 
SQL>>> conn.execute(s, x='m', y='z', e1='%@aol.com', e2='%@msn.com').fetchall() 
[(u'Wendy Williams, [email protected]',)] 

İlk önce SQL dize almak ve sqalchemy.sql.text()'a ilet. Bu

avantajları metin() düz dize üzerinde sağlar ... gerekli ama muhtemelen iyi bir fikir değil, başı deyimi yürütme seçenekleri bağlama parametreleri için arka uç nötr desteğidir yanı olarak SQLAlchemy tipi yapıların, tam olarak belirtilen bir deyimi yürütürken rol oynamalarına izin veren parametre ve sonuç sütun tanımlama davranışı. Eğer text() kullanmadıysanız bile, sadece sql.format(...) kullanmak ASLA

Not. Bu, SQL injection saldırısı riskini artırır.

Daha önce, kullanmakta olduğunuz execute() işlevine anahtar sözcük parametrelerini kullanarak gerçek bağımsız değişkenleri belirtebilirsiniz.

Şimdi, örneğinizde, yürütme işlevini saran bir işleviniz var. Yani, bunu birden fazla sorgu için kullanmak isterseniz, parametrelerinizi argümanlarınızı alabilmeniz gerekir. senin parametre olarak anahtar kelimeleri kullanma

sql = 'SELECT ...' 
data = { 'user_id' : 3 } 
results = _sql_to_data(sql, data) 

sadece bir yoludur ...

def _sql_to_data(sql, values): 
    ... 
    conn.execute(sql, values) 

values bir dictionary.You sonra bu gibi işlevini kullanabilirsiniz olacaktır: Bir sözlük olarak bu oldukça basit yapabilirdi argümanların execute() fonksiyonuna belirtilmesi. Bu işlev için the documentation'u birkaç farklı yoldan okuyabilirsiniz.

+3

Teşekkür ederim, kötüyüm, nedense doktora bulamadım. Benim tek bir mazeret SQLAlchemy doc biraz ORM üzerinde vurgu ile parçalanmış. – Denis

+0

Bir soru daha - fetchAll() nasıl yapılır ve sonuçta yapılan veri yapısı, bellek tüketimi açısından satırlardaki satırlar ile ilgilidir. – Denis

+0

@Denis: Tam olarak ne demek istediğinden emin değilim. Belki başka bir StackOverflow sorusu oluşturmalı ve ne sorduğun hakkında daha spesifik olmalısın. –