<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Python的ORM框架中SQLAlchemy庫的查詢操作的教程

        來源:懂視網 責編:小采 時間:2020-11-27 14:33:02
        文檔

        Python的ORM框架中SQLAlchemy庫的查詢操作的教程

        Python的ORM框架中SQLAlchemy庫的查詢操作的教程:1. 返回列表和標量(Scalar) 前面我們注意到Query對象可以返回可迭代的值(iterator value),然后我們可以通過for in來查詢。不過Query對象的all()、one()以及first()方法將返回非迭代值(non-iterator value),比如說all()返回的是一個列
        推薦度:
        導讀Python的ORM框架中SQLAlchemy庫的查詢操作的教程:1. 返回列表和標量(Scalar) 前面我們注意到Query對象可以返回可迭代的值(iterator value),然后我們可以通過for in來查詢。不過Query對象的all()、one()以及first()方法將返回非迭代值(non-iterator value),比如說all()返回的是一個列

        1. 返回列表和標量(Scalar)

        前面我們注意到Query對象可以返回可迭代的值(iterator value),然后我們可以通過for in來查詢。不過Query對象的all()、one()以及first()方法將返回非迭代值(non-iterator value),比如說all()返回的是一個列表:

        >>> query = session.query(User).
        >>> filter(User.name.like('%ed')).order_by(User.id)
        >>> query.all() 
        SELECT users.id AS users_id,
         users.name AS users_name,
         users.fullname AS users_fullname,
         users.password AS users_password
        FROM users
        WHERE users.name LIKE ? ORDER BY users.id
        ('%ed',)
         
        [User('ed','Ed Jones', 'f8s7ccs'), User('fred','Fred Flinstone', 'blah')]
        
        

        first()方法限制并僅作為標量返回結果集的第一條記錄:

        >>> query.first() 
        SELECT users.id AS users_id,
         users.name AS users_name,
         users.fullname AS users_fullname,
         users.password AS users_password
        FROM users
        WHERE users.name LIKE ? ORDER BY users.id
         LIMIT ? OFFSET ?
        ('%ed', 1, 0)
         
        
        
        

        one()方法,完整的提取所有的記錄行,并且如果沒有明確的一條記錄行(沒有找到這條記錄)或者結果中存在多條記錄行,將會引發錯誤異常NoResultFound或者MultipleResultsFound:

        >>> from sqlalchemy.orm.exc import MultipleResultsFound
        >>> try: 
        ... user = query.one()
        ... except MultipleResultsFound, e:
        ... print e
        SELECT users.id AS users_id,
         users.name AS users_name,
         users.fullname AS users_fullname,
         users.password AS users_password
        FROM users
        WHERE users.name LIKE ? ORDER BY users.id
        ('%ed',)
         
        Multiple rows were found for one()
        
        >>> from sqlalchemy.orm.exc import NoResultFound
        >>> try: 
        ... user = query.filter(User.id == 99).one()
        ... except NoResultFound, e:
        ... print e
        SELECT users.id AS users_id,
         users.name AS users_name,
         users.fullname AS users_fullname,
         users.password AS users_password
        FROM users
        WHERE users.name LIKE ? AND users.id = ? ORDER BY users.id
        ('%ed', 99)
         
        No row was found for one()
        
        

        2. 使用原義SQL (Literal SQL)

        Query對象能夠靈活的使用原義SQL查詢字符串作為查詢參數,比如我們之前用過的filter()和order_by()方法:

        >>> for user in session.query(User).
        ... filter("id<224").
        ... order_by("id").all(): 
        ... print user.name
        SELECT users.id AS users_id,
         users.name AS users_name,
         users.fullname AS users_fullname,
         users.password AS users_password
        FROM users
        WHERE id<224 ORDER BY id
        ()
         
        ed
        wendy
        mary
        fred
        
        

        當然很多人可能會和我感覺一樣,會有些不適應,因為使用ORM就是為了擺脫SQL語句的,沒想到現在又看到SQL的影子了。呵呵,SQLAlchemy也要照顧到使用上的靈活性嘛,畢竟有些查詢語句直接編入要容易得多。

        當然綁定參數也可以用基于字符串的SQL指派,使用冒號來標記替代參數,然后再使用params()方法指定相應的值:

        >>> session.query(User).filter("id<:value and name=:name").
        ... params(value=224, name='fred').order_by(User.id).one() 
        SELECT users.id AS users_id,
         users.name AS users_name,
         users.fullname AS users_fullname,
         users.password AS users_password
        FROM users
        WHERE id
        
        

        到這里,SQL語句的樣子已經初見端倪了,其實我們可以更極端一點,直接使用SQL語句,什么?這樣就失去ORM的價值了!別急,這里只是介紹一下支持這種用法,當然我建議不到萬不得已,盡量不要這樣寫,因為可能會有兼容的問題,畢竟各個數據庫的SQL方言不一樣。不過有一點需要注意的是,如果要直接使用原生SQL語句,在被query()所查詢的映射類中,你必須保證語句所指代的列仍然被映射類所管理,比如接下來的例子:

        >>> session.query(User).from_statement(
        ... "SELECT * FROM users where name=:name").
        ... params(name='ed').all()
        SELECT * FROM users where name=?
        ('ed',)
         
        []
        
        

        我們還可以在query()中直接使用列名來指派我們想要的列而擺脫映射類的束縛:

        >>> session.query("id", "name", "thenumber12").
        ... from_statement("SELECT id, name, 12 as "
        ... "thenumber12 FROM users where name=:name").
        ... params(name='ed').all()
        SELECT id, name, 12 as thenumber12 FROM users where name=?
        ('ed',)
         
        [(1, u'ed', 12)]
        
        

        3. 計數 (Counting)

        對于Query來說,計數功能也有個單獨的方法稱為count():

        >>> session.query(User).filter(User.name.like('%ed')).count() 
        SELECT count(*) AS count_1
        FROM (SELECT users.id AS users_id,
         users.name AS users_name,
         users.fullname AS users_fullname,
         users.password AS users_password
        FROM users
        WHERE users.name LIKE ?) AS anon_1
        ('%ed',)
         
        2
        
        

        count()方法被用于確定返回的結果集中有多少行,讓我們觀察一下產生的SQL語句,SQLAlchemy先是取出符合條件的所有行集合,然后再通過SELECT count(*)來統計有多少行。當然有點SQL知識的同學可能知道這條語句可以以更精簡的方式寫出來,比如SELECT count(*) FROM table,當然現代版本的SQLAlchemy不會去揣摩這樣的想法。

        假使我們要讓查詢語句更加精煉或者要明確要統計的列,我們可以通過表達式func.count()直接使用count函數,比如下面的例子介紹統計并返回每個唯一的用戶名字:

        >>> from sqlalchemy import func
        >>> session.query(func.count(User.name), User.name).group_by(User.name).all() 
        SELECT count(users.name) AS count_1, users.name AS users_name
        FROM users GROUP BY users.name
        ()
         
        [(1, u'ed'), (1, u'fred'), (1, u'mary'), (1, u'wendy')]
        
        

        對于剛才提到的簡單SELECT count(*) FROM table語句,我們可以通過下面的例子來實現:

        >>> session.query(func.count('*')).select_from(User).scalar()
        SELECT count(?) AS count_1
        FROM users
        ('*',)
         
        4
        
        

        當然如果我們直接統計User的主鍵,上面的語句可以更加簡練,我們可以省去select_from()方法:

        >>> session.query(func.count(User.id)).scalar() 
        SELECT count(users.id) AS count_1
        FROM users
        ()
         
        4
        
        

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Python的ORM框架中SQLAlchemy庫的查詢操作的教程

        Python的ORM框架中SQLAlchemy庫的查詢操作的教程:1. 返回列表和標量(Scalar) 前面我們注意到Query對象可以返回可迭代的值(iterator value),然后我們可以通過for in來查詢。不過Query對象的all()、one()以及first()方法將返回非迭代值(non-iterator value),比如說all()返回的是一個列
        推薦度:
        標簽: 教程 python 庫的
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久国产美女免费观看精品 | 国产99久久久国产精免费| 国产成人午夜精品免费视频| 91在线亚洲精品专区| 99免费在线观看视频| 久久久久亚洲AV片无码下载蜜桃| 中文字幕在线免费播放| 亚洲精品狼友在线播放| 无码中文字幕av免费放dvd| 亚洲精品视频免费看| 久久久久久国产精品免费免费| 精品亚洲成在人线AV无码| 99久久免费精品国产72精品九九 | 大陆一级毛片免费视频观看| 91丁香亚洲综合社区| 在线免费观看一级毛片| 在线观看亚洲网站| 亚洲中文字幕日产乱码高清app| 国产福利免费视频| 亚洲国产精品久久久久网站| 99在线视频免费观看视频| 国产精品无码亚洲精品2021| 亚洲爽爽一区二区三区| 久久久久久久岛国免费播放 | 国产成人精品久久亚洲| 日本在线免费观看| 亚洲一级毛片免观看| 日本黄色免费观看| 久久精品成人免费观看97| 亚洲一区二区影院| 男女啪啪永久免费观看网站| 91视频精品全国免费观看| 亚洲性色高清完整版在线观看| 国产一级理论免费版| a级毛片免费完整视频| 亚洲日本va在线观看| 亚洲一区二区三区在线视频| 足恋玩丝袜脚视频免费网站| 亚洲熟妇无码一区二区三区| 久久精品国产亚洲沈樵| 亚洲一区二区三区免费|