[英]Select statement with SqlAlchemy
是的,非常基本的問題。 我已經使用declarative_base成功創建了數據庫,並且也可以向數據庫執行插入操作。 我只是對SqlAlchemy sql語句有幾個問題。
我創建了一個名為Location的表。
一些問題(請參見下面的代碼):
對於語句“打印行”,我必須指定要輸出的每個列名稱。 即“打印row.name,row.lat等”為什么? (否則,打印語句輸出"<classname.Location at <...>>"
此外,與數據庫交互並執行查詢(選擇,插入,更新等)的首選方式是什么-似乎有很多選擇:例如使用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
Location
是什么。 我假設它是一個映射的類,所以您正在請求所有Location
對象的列表,而不是rows 。 當您打印對象時,將獲得其字符串表示形式。 通過定義自定義__str__
方法可以更改對象的字符串表示形式。 sqlalchemy.orm
包中包含函數的原因。 使用ORM時,與db進行交互的首選方法是不使用查詢,而是使用與要操作的表相對應的對象,通常將其與會話對象結合使用。 SELECT查詢在某些ORM中成為get()或find()調用,在其他ORM中成為query()調用。 INSERT會創建所需類型的新對象(並且可能會顯式添加它,例如sqlalchemy中的session.add())。 UPDATE成為編輯這樣的對象,而DELETE成為刪除對象(例如session.delete())。 ORM旨在為您處理將這些操作轉換為SQL的艱巨工作。
你看過教程了嗎?
Denis和Kylotan給了您很好的答案。 我只關注第二點。
有時取決於您的口味。 有時候,您需要ORM無法完成的數據庫特定功能,在這種情況下,您應該使用Session(<sql here>).execute()
或conn.execute(<sql here>)
。 另一種情況是,您遇到了非常復雜的查詢,而您又找不到合適的ORM表達式。
通常,使用select([...]).where(...
或Session.query(<Model here>).filter(...
(聲明性基數))之類的ORM功能就足夠了。幾乎每個sql查詢都有一個ORM當量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.