2009-11-19 65 views
0

是的,非常基本的問題。 我已經使用declarative_base成功創建了我的數據庫,並且也可以在數據庫中執行插入操作。我只有幾個關於SqlAlchemy sql語句的問題。Select language with SqlAlchemy

我創建了一個名爲Location的表。
幾個問題/問題(見下面的代碼):

  1. 有關聲明,「打印行」,我指定我想有輸出的每個列名。即「print row.name,row.lat等」爲什麼? (否則打印語句輸出"<classname.Location at <...>>"

  2. 此外,什麼是與數據庫進行交互和執行查詢(選擇,插入,更新等)的首選方式 - 似乎有一堆選項:使用sqlalchemy。 orm.select例如,或engine.text (<sql query>).execute().fetchall(),甚至conn.execute(<select>).選項是偉大的,但現在他們都只是困惑我。

感謝這麼多的祕訣!

這裏是我的代碼:

from sqlalchemy import create_engine 
from sqlalchemy.sql import select 
from location_db_setup import * 

db_path = "sqlite:////volumes/users/shared/programming/python/web/map.db" 
engine = create_engine(db_path, echo= True) 
Session = sessionmaker(bind= engine) 
session = Session() 

session.query(Location).fetchall() 
for row in locations: 
     print row 

回答

2
  1. 您在樣本中的代碼不完整並且有錯誤。所以這裏無法確定什麼是Location。我認爲這是一個映射類,因此您要求列出所有對象的所有Location,而不是。當你打印一個對象時,你會得到它的字符串表示。可以通過定義自定義__str__方法來更改對象的字符串表示形式。
  2. 雖然ORM是SQLAlchemy最重要的部分,但它不是唯一的。它還直接暴露了許多與ORM無關的功能。在使用對象時,創建查詢的首選方法是相應的會話方法。但有時您需要可選對象而不綁定到特定會話(它們不是直接執行,而是在傳遞給會話方法的表達式中使用)。這就是爲什麼在sqlalchemy.orm包中有功能。
1

使用ORM時與數據庫進行交互的首選方式不是使用查詢,而是使用與您操作的表對應的對象,通常與會話對象一起使用。 SELECT查詢在某些ORM中變爲get()或find()調用,在其他情況下調用query()調用。 INSERT變成創建你想要的類型的新對象(也許明確地添加它,例如sqlalchemy中的session.add())。 UPDATE變成編輯這樣一個對象,而DELETE變爲刪除一個對象(例如session.delete())。 ORM旨在處理將這些操作轉換爲SQL的艱苦工作。

你看過the tutorial嗎?

1

丹尼斯和Kylotan給你很好的答案。我只關注第2點。

有時取決於你的口味。有時候您需要ORM無法執行的數據庫特定功能,那麼您應該使用Session(<sql here>).execute()conn.execute(<sql here>)。另一種情況是當你有一個超出你的非常複雜的查詢時,你找不到合適的ORM表達式。

通常,使用ORM功能(如select([...]).where(...Session.query(<Model here>).filter(...(聲明性基))就足夠了。幾乎每個sql查詢都有一個ORM等價物。