簡體   English   中英

使用SqlAlchemy的Select語句

[英]Select statement with SqlAlchemy

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

我創建了一個名為Location的表。
一些問題(請參見下面的代碼):

  1. 對於語句“打印行”,我必須指定要輸出的每個列名稱。 即“打印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
  1. 您的示例代碼不完整,並且有錯誤。 因此,無法確定此處的Location是什么。 我假設它是一個映射的類,所以您正在請求所有Location 對象的列表,而不是rows 當您打印對象時,將獲得其字符串表示形式。 通過定義自定義__str__方法可以更改對象的字符串表示形式。
  2. 盡管ORM是SQLAlchemy最重要的部分,但不是唯一的。 它還公開了許多與ORM直接不相關的功能。 使用對象時,創建查詢的首選方法是相應的會話方法。 但是有時您需要不綁定到特定會話的可選對象(它們不直接執行,而是在傳遞給會話方法的表達式中使用)。 這就是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM