日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

python 之路,Day11 (下)- sqlalchemy ORM

發(fā)布時(shí)間:2023/11/27 生活经验 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 之路,Day11 (下)- sqlalchemy ORM 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

python 之路,Day11 - sqlalchemy ORM

?

本節(jié)內(nèi)容

  1. ORM介紹
  2. sqlalchemy安裝
  3. sqlalchemy基本使用
  4. 多外鍵關(guān)聯(lián)
  5. 多對(duì)多關(guān)系
  6. 表結(jié)構(gòu)設(shè)計(jì)作業(yè)

?

1.?ORM介紹

orm英文全稱(chēng)object relational mapping,就是對(duì)象映射關(guān)系程序,簡(jiǎn)單來(lái)說(shuō)我們類(lèi)似python這種面向?qū)ο蟮某绦騺?lái)說(shuō)一切皆對(duì)象,但是我們使用的數(shù)據(jù)庫(kù)卻都是關(guān)系型的,為了保證一致的使用習(xí)慣,通過(guò)orm將編程語(yǔ)言的對(duì)象模型和數(shù)據(jù)庫(kù)的關(guān)系模型建立映射關(guān)系,這樣我們?cè)谑褂镁幊陶Z(yǔ)言對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的時(shí)候可以直接使用編程語(yǔ)言的對(duì)象模型進(jìn)行操作就可以了,而不用直接使用sql語(yǔ)言。

orm的優(yōu)點(diǎn):

  1. 隱藏了數(shù)據(jù)訪(fǎng)問(wèn)細(xì)節(jié),“封閉”的通用數(shù)據(jù)庫(kù)交互,ORM的核心。他使得我們的通用數(shù)據(jù)庫(kù)交互變得簡(jiǎn)單易行,并且完全不用考慮該死的SQL語(yǔ)句。快速開(kāi)發(fā),由此而來(lái)。
  2. ORM使我們構(gòu)造固化數(shù)據(jù)結(jié)構(gòu)變得簡(jiǎn)單易行。

缺點(diǎn):

  1. 無(wú)可避免的,自動(dòng)化意味著映射和關(guān)聯(lián)管理,代價(jià)是犧牲性能(早期,這是所有不喜歡ORM人的共同點(diǎn))。現(xiàn)在的各種ORM框架都在嘗試使用各種方法來(lái)減輕這塊(LazyLoad,Cache),效果還是很顯著的。

?

2. sqlalchemy安裝

在Python中,最有名的ORM框架是SQLAlchemy。用戶(hù)包括openstack\Dropbox等知名公司或應(yīng)用,主要用戶(hù)列表http://www.sqlalchemy.org/organizations.html#openstack

Dialect用于和數(shù)據(jù)API進(jìn)行交流,根據(jù)配置文件的不同調(diào)用不同的數(shù)據(jù)庫(kù)API,從而實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,如:

1 2 3 4 5 6 7 8 9 10 11 12 13 MySQL-Python ????mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> ??? pymysql ????mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] ??? MySQL-Connector ????mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> ??? cx_Oracle ????oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...] ??? 更多詳見(jiàn):http://docs.sqlalchemy.org/en/latest/dialects/index.html

  

安裝sqlalchemy

1 pip?install?SQLAlchemy<br><br>pip?install?pymysql??#由于mysqldb依然不支持py3,所以這里我們用pymysql與sqlalchemy交互

?

3.sqlalchemy基本使用

下面就開(kāi)始讓你見(jiàn)證orm的nb之處,盤(pán)古開(kāi)天劈地之前,我們創(chuàng)建一個(gè)表是這樣的

1 2 3 4 5 6 CREATE?TABLE?user?( ????id?INTEGER?NOT?NULL?AUTO_INCREMENT, ????name?VARCHAR(32), ????password?VARCHAR(64), ????PRIMARY?KEY?(id) )

這只是最簡(jiǎn)單的sql表,如果再加上外鍵關(guān)聯(lián)什么的,一般程序員的腦容量是記不住那些sql語(yǔ)句的,于是有了orm,實(shí)現(xiàn)上面同樣的功能,代碼如下

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import?sqlalchemy from?sqlalchemy?import?create_engine from?sqlalchemy.ext.declarative?import?declarative_base from?sqlalchemy?import?Column, Integer, String engine?=?create_engine("mysql+pymysql://root:alex3714@localhost/testdb", ????????????????????????????????????encoding='utf-8', echo=True) Base?=?declarative_base()?#生成orm基類(lèi) class?User(Base): ????__tablename__?=?'user'?#表名 ????id?=?Column(Integer, primary_key=True) ????name?=?Column(String(32)) ????password?=?Column(String(64)) Base.metadata.create_all(engine)?#創(chuàng)建表結(jié)構(gòu)

你說(shuō),娘那個(gè)腚的,并沒(méi)有感覺(jué)代碼量變少啊,呵呵, 孩子莫猴急,好戲在后面

Lazy Connecting
The Engine, when first returned by create_engine(), has not actually tried to connect to the database yet; that happens only the first time it is asked to perform a task against the database.  

除上面的創(chuàng)建之外,還有一種創(chuàng)建表的方式,雖不常用,但還是看看吧

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from?sqlalchemy?import?Table, MetaData, Column, Integer, String, ForeignKey from?sqlalchemy.orm?import?mapper metadata?=?MetaData() user?=?Table('user', metadata, ????????????Column('id', Integer, primary_key=True), ????????????Column('name', String(50)), ????????????Column('fullname', String(50)), ????????????Column('password', String(12)) ????????) class?User(object): ????def?__init__(self, name, fullname, password): ????????self.name?=?name ????????self.fullname?=?fullname ????????self.password?=?password mapper(User, user)?#the table metadata is created separately with the Table construct, then associated with the User class via the mapper() function

事實(shí)上,我們用第一種方式創(chuàng)建的表就是基于第2種方式的再封裝。

?

  

最基本的表我們創(chuàng)建好了,那我們開(kāi)始用orm創(chuàng)建一條數(shù)據(jù)試試

1 2 3 4 5 6 7 8 9 10 11 Session_class?=?sessionmaker(bind=engine)?#創(chuàng)建與數(shù)據(jù)庫(kù)的會(huì)話(huà)session class ,注意,這里返回給session的是個(gè)class,不是實(shí)例 Session?=?Session_class()?#生成session實(shí)例 user_obj?=?User(name="alex",password="alex3714")?#生成你要?jiǎng)?chuàng)建的數(shù)據(jù)對(duì)象 print(user_obj.name,user_obj.id)??#此時(shí)還沒(méi)創(chuàng)建對(duì)象呢,不信你打印一下id發(fā)現(xiàn)還是None Session.add(user_obj)?#把要?jiǎng)?chuàng)建的數(shù)據(jù)對(duì)象添加到這個(gè)session里, 一會(huì)統(tǒng)一創(chuàng)建 print(user_obj.name,user_obj.id)?#此時(shí)也依然還沒(méi)創(chuàng)建 Session.commit()?#現(xiàn)此才統(tǒng)一提交,創(chuàng)建數(shù)據(jù)

我擦,寫(xiě)這么多代碼才創(chuàng)建一條數(shù)據(jù),你表示太tm的費(fèi)勁了,正要轉(zhuǎn)身離開(kāi),我拉住你的手不放開(kāi),高潮還沒(méi)到。。

查詢(xún)

1 2 my_user?=?Session.query(User).filter_by(name="alex").first() print(my_user)

此時(shí)你看到的輸出是這樣的應(yīng)該

1 <__main__.User?object?at?0x105b4ba90>

我擦,這是什么?這就是你要的數(shù)據(jù)呀, 只不過(guò)sqlalchemy幫你把返回的數(shù)據(jù)映射成一個(gè)對(duì)象啦,這樣你調(diào)用每個(gè)字段就可以跟調(diào)用對(duì)象屬性一樣啦,like this..

1 2 3 4 print(my_user.id,my_user.name,my_user.password) 輸出 1?alex alex3714

不過(guò)剛才上面的顯示的內(nèi)存對(duì)象對(duì)址你是沒(méi)辦法分清返回的是什么數(shù)據(jù)的,除非打印具體字段看一下,如果想讓它變的可讀,只需在定義表的類(lèi)下面加上這樣的代碼

1 2 3 def?__repr__(self): ????return?"<User(name='%s',? password='%s')>"?%?( ????????self.name,?self.password)

  

修改

1 2 3 4 5 my_user?=?Session.query(User).filter_by(name="alex").first() my_user.name?=?"Alex Li" Session.commit()

回滾

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 my_user?=?Session.query(User).filter_by(id=1).first() my_user.name?=?"Jack" fake_user?=?User(name='Rain', password='12345') Session.add(fake_user) print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() )??#這時(shí)看session里有你剛添加和修改的數(shù)據(jù) Session.rollback()?#此時(shí)你rollback一下 print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() )?#再查就發(fā)現(xiàn)剛才添加的數(shù)據(jù)沒(méi)有了。 # Session # Session.commit()

  

獲取所有數(shù)據(jù)

1 print(Session.query(User.name,User.id).all() )

?

多條件查詢(xún)

1 objs?=?Session.query(User).filter(User.id>0).filter(User.id<7).all()

上面2個(gè)filter的關(guān)系相當(dāng)于 user.id >1 AND user.id <7 的效果

統(tǒng)計(jì)和分組

1 Session.query(User).filter(User.name.like("Ra%")).count()

分組

1 2 from?sqlalchemy?import?func print(Session.query(func.count(User.name),User.name).group_by(User.name).all() )

相當(dāng)于原生sql為

1 2 SELECT count(user.name) AS count_1, user.name AS user_name FROM user GROUP BY user.name

輸出為

[(1, 'Jack'), (2, 'Rain')]

?

外鍵關(guān)聯(lián)

我們創(chuàng)建一個(gè)addresses表,跟user表關(guān)聯(lián)

1 2 3 4 5 6 7 8 9 10 11 12 13 from?sqlalchemy?import?ForeignKey from?sqlalchemy.orm?import?relationship class?Address(Base): ????__tablename__?=?'addresses' ????id?=?Column(Integer, primary_key=True) ????email_address?=?Column(String(32), nullable=False) ????user_id?=?Column(Integer, ForeignKey('user.id')) ????user?=?relationship("User", backref="addresses")?#這個(gè)nb,允許你在user表里通過(guò)backref字段反向查出所有它在addresses表里的關(guān)聯(lián)項(xiàng) ????def?__repr__(self): ????????return?"<Address(email_address='%s')>"?%?self.email_address

The?relationship.back_populates?parameter is a newer version of a very common SQLAlchemy feature calledrelationship.backref. The?relationship.backref?parameter hasn’t gone anywhere and will always remain available! The?relationship.back_populates?is the same thing, except a little more verbose and easier to manipulate. For an overview of the entire topic, see the section?Linking Relationships with Backref.  

  

表創(chuàng)建好后,我們可以這樣反查試試

1 2 3 4 5 6 obj?=?Session.query(User).first() for?i?in?obj.addresses:?#通過(guò)user對(duì)象反查關(guān)聯(lián)的addresses記錄 ????print(i) addr_obj?=?Session.query(Address).first() print(addr_obj.user.name)??#在addr_obj里直接查關(guān)聯(lián)的user表

創(chuàng)建關(guān)聯(lián)對(duì)象

1 2 3 4 5 6 7 8 obj?=?Session.query(User).filter(User.name=='rain').all()[0] print(obj.addresses) obj.addresses?=?[Address(email_address="r1@126.com"),?#添加關(guān)聯(lián)對(duì)象 ?????????????????Address(email_address="r2@126.com")] Session.commit()

?

?

常用查詢(xún)語(yǔ)法

Common Filter Operators

Here’s a rundown of some of the most common operators used in filter():

  • equals:

         query.filter(User.name == 'ed')
    
  • not equals:

         query.filter(User.name != 'ed')
    
  • LIKE:

    query.filter(User.name.like('%ed%'))

  • IN:

  • NOT IN:
    query.filter(~User.name.in_(['ed', 'wendy', 'jack']))

  • IS NULL:

  • IS NOT NULL:

  • AND:
    2.1. ObjectRelationalTutorial 17

query.filter(User.name.in_(['ed', 'wendy', 'jack']))
# works with query objects too:

query.filter(User.name.in_( session.query(User.name).filter(User.name.like('%ed%'))

))

query.filter(User.name == None)
# alternatively, if pep8/linters are a concern
query.filter(User.name.is_(None))
query.filter(User.name != None)
# alternatively, if pep8/linters are a concern
query.filter(User.name.isnot(None))

SQLAlchemy Documentation, Release 1.1.0b1

# use and_()

from sqlalchemy import and_
query.filter(and_(User.name == 'ed', User.fullname == 'Ed Jones'))

# or send multiple expressions to .filter()
query.filter(User.name == 'ed', User.fullname == 'Ed Jones')
# or chain multiple filter()/filter_by() calls
query.filter(User.name == 'ed').filter(User.fullname == 'Ed Jones')

Note: Makesureyouuseand_()andnotthePythonandoperator! ? OR:

Note: Makesureyouuseor_()andnotthePythonoroperator! ? MATCH:

query.filter(User.name.match('wendy'))
Note: match() uses a database-specific MATCH or CONTAINS f?

?

  

4.多外鍵關(guān)聯(lián)

One of the most common situations to deal with is when there are more than one foreign key path between two tables.

Consider a?Customer?class that contains two foreign keys to an?Address?class:

下表中,Customer表有2個(gè)字段都關(guān)聯(lián)了Address表?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from?sqlalchemy?import?Integer, ForeignKey, String, Column from?sqlalchemy.ext.declarative?import?declarative_base from?sqlalchemy.orm?import?relationship Base?=?declarative_base() class?Customer(Base): ????__tablename__?=?'customer' ????id?=?Column(Integer, primary_key=True) ????name?=?Column(String) ????billing_address_id?=?Column(Integer, ForeignKey("address.id")) ????shipping_address_id?=?Column(Integer, ForeignKey("address.id")) ????billing_address?=?relationship("Address")? ????shipping_address?=?relationship("Address") class?Address(Base): ????__tablename__?=?'address' ????id?=?Column(Integer, primary_key=True) ????street?=?Column(String) ????city?=?Column(String) ????state?=?Column(String)

創(chuàng)建表結(jié)構(gòu)是沒(méi)有問(wèn)題的,但你Address表中插入數(shù)據(jù)時(shí)會(huì)報(bào)下面的錯(cuò)

1 2 3 4 5 6 sqlalchemy.exc.AmbiguousForeignKeysError: Could?not?determine join condition between parent/child tables on relationship Customer.billing_address?-?there are multiple foreign key paths linking the tables.? Specify the?'foreign_keys'?argument, providing a?list?of those columns which should be counted as containing a foreign key reference to the parent table.

解決辦法如下

1 2 3 4 5 6 7 8 9 10 class?Customer(Base): ????__tablename__?=?'customer' ????id?=?Column(Integer, primary_key=True) ????name?=?Column(String) ????billing_address_id?=?Column(Integer, ForeignKey("address.id")) ????shipping_address_id?=?Column(Integer, ForeignKey("address.id")) ????billing_address?=?relationship("Address", foreign_keys=[billing_address_id]) ????shipping_address?=?relationship("Address", foreign_keys=[shipping_address_id])

這樣sqlachemy就能分清哪個(gè)外鍵是對(duì)應(yīng)哪個(gè)字段了

  

5.多對(duì)多關(guān)系

現(xiàn)在來(lái)設(shè)計(jì)一個(gè)能描述“圖書(shū)”與“作者”的關(guān)系的表結(jié)構(gòu),需求是

  1. 一本書(shū)可以有好幾個(gè)作者一起出版
  2. 一個(gè)作者可以寫(xiě)好幾本書(shū)

此時(shí)你會(huì)發(fā)現(xiàn),用之前學(xué)的外鍵好像沒(méi)辦法實(shí)現(xiàn)上面的需求了,因?yàn)?/p>

當(dāng)然你更不可以像下面這樣干,因?yàn)檫@樣就你就相當(dāng)于有多條書(shū)的記錄了,太low b了,改書(shū)名還得都改。。。

?

那怎么辦呢? 此時(shí),我們可以再搞出一張中間表,就可以了

這樣就相當(dāng)于通過(guò)book_m2m_author表完成了book表和author表之前的多對(duì)多關(guān)聯(lián)

用orm如何表示呢?

#一本書(shū)可以有多個(gè)作者,一個(gè)作者又可以出版多本書(shū)from sqlalchemy import Table, Column, Integer,String,DATE, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmakerBase = declarative_base()book_m2m_author = Table('book_m2m_author', Base.metadata,Column('book_id',Integer,ForeignKey('books.id')),Column('author_id',Integer,ForeignKey('authors.id')),)class Book(Base):__tablename__ = 'books'id = Column(Integer,primary_key=True)name = Column(String(64))pub_date = Column(DATE)authors = relationship('Author',secondary=book_m2m_author,backref='books')def __repr__(self):return self.nameclass Author(Base):__tablename__ = 'authors'id = Column(Integer, primary_key=True)name = Column(String(32))def __repr__(self):return self.name

?

接下來(lái)創(chuàng)建幾本書(shū)和作者

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Session_class?=?sessionmaker(bind=engine)?#創(chuàng)建與數(shù)據(jù)庫(kù)的會(huì)話(huà)session class ,注意,這里返回給session的是個(gè)class,不是實(shí)例 s?=?Session_class()?#生成session實(shí)例 b1?=?Book(name="跟Alex學(xué)Python") b2?=?Book(name="跟Alex學(xué)把妹") b3?=?Book(name="跟Alex學(xué)裝逼") b4?=?Book(name="跟Alex學(xué)開(kāi)車(chē)") a1?=?Author(name="Alex") a2?=?Author(name="Jack") a3?=?Author(name="Rain") b1.authors?=?[a1,a2] b2.authors?=?[a1,a2,a3] s.add_all([b1,b2,b3,b4,a1,a2,a3]) s.commit()

此時(shí),手動(dòng)連上mysql,分別查看這3張表,你會(huì)發(fā)現(xiàn),book_m2m_author中自動(dòng)創(chuàng)建了多條紀(jì)錄用來(lái)連接book和author表

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 mysql> select?*?from?books; +----+------------------+----------+ |?id?| name???????????? | pub_date | +----+------------------+----------+ |??1?| 跟Alex學(xué)Python?? | NULL???? | |??2?| 跟Alex學(xué)把妹???? | NULL???? | |??3?| 跟Alex學(xué)裝逼???? | NULL???? | |??4?| 跟Alex學(xué)開(kāi)車(chē)???? | NULL???? | +----+------------------+----------+ 4?rows?in?set?(0.00?sec) mysql> select?*?from?authors; +----+------+ |?id?| name | +----+------+ |?10?| Alex | |?11?| Jack | |?12?| Rain | +----+------+ 3?rows?in?set?(0.00?sec) mysql> select?*?from?book_m2m_author; +---------+-----------+ | book_id | author_id | +---------+-----------+ |???????2?|????????10?| |???????2?|????????11?| |???????2?|????????12?| |???????1?|????????10?| |???????1?|????????11?| +---------+-----------+ 5?rows?in?set?(0.00?sec)

?

此時(shí),我們?nèi)ビ胦rm查一下數(shù)據(jù)

1 2 3 4 5 6 7 8 9 print('--------通過(guò)書(shū)表查關(guān)聯(lián)的作者---------') book_obj?=?s.query(Book).filter_by(name="跟Alex學(xué)Python").first() print(book_obj.name, book_obj.authors) print('--------通過(guò)作者表查關(guān)聯(lián)的書(shū)---------') author_obj?=s.query(Author).filter_by(name="Alex").first() print(author_obj.name , author_obj.books) s.commit()

輸出如下

1 2 3 4 --------通過(guò)書(shū)表查關(guān)聯(lián)的作者--------- 跟Alex學(xué)Python [Alex, Jack] --------通過(guò)作者表查關(guān)聯(lián)的書(shū)--------- Alex [跟Alex學(xué)把妹, 跟Alex學(xué)Python]

牛逼了我的哥!!完善實(shí)現(xiàn)多對(duì)多  

  

多對(duì)多刪除

刪除數(shù)據(jù)時(shí)不用管boo_m2m_authors , sqlalchemy會(huì)自動(dòng)幫你把對(duì)應(yīng)的數(shù)據(jù)刪除

通過(guò)書(shū)刪除作者

1 2 3 4 5 6 author_obj?=s.query(Author).filter_by(name="Jack").first() book_obj?=?s.query(Book).filter_by(name="跟Alex學(xué)把妹").first() book_obj.authors.remove(author_obj)?#從一本書(shū)里刪除一個(gè)作者 s.commit()

直接刪除作者 

刪除作者時(shí),會(huì)把這個(gè)作者跟所有書(shū)的關(guān)聯(lián)關(guān)系數(shù)據(jù)也自動(dòng)刪除

1 2 3 4 author_obj?=s.query(Author).filter_by(name="Alex").first() # print(author_obj.name , author_obj.books) s.delete(author_obj) s.commit()

  

處理中文

sqlalchemy設(shè)置編碼字符集一定要在數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的URL上增加charset=utf8,否則數(shù)據(jù)庫(kù)的連接就不是utf8的編碼格式

eng = create_engine('mysql://root:root@localhost:3306/test2?charset=utf8',echo=True)

 

 

6.本節(jié)作業(yè)

主題:學(xué)員管理系統(tǒng)

需求:

  • 用戶(hù)角色,講師\學(xué)員, 用戶(hù)登陸后根據(jù)角色不同,能做的事情不同,分別如下
  • 講師視圖
    1.   管理班級(jí),可創(chuàng)建班級(jí),根據(jù)學(xué)員qq號(hào)把學(xué)員加入班級(jí)
    2.   可創(chuàng)建指定班級(jí)的上課紀(jì)錄,注意一節(jié)上課紀(jì)錄對(duì)應(yīng)多條學(xué)員的上課紀(jì)錄, 即每節(jié)課都有整班學(xué)員上, 為了紀(jì)錄每位學(xué)員的學(xué)習(xí)成績(jī),需在創(chuàng)建每節(jié)上課紀(jì)錄是,同時(shí) ? ? ? ? 為這個(gè)班的每位學(xué)員創(chuàng)建一條上課紀(jì)錄
    3.   為學(xué)員批改成績(jī), 一條一條的手動(dòng)修改成績(jī)
  • 學(xué)員視圖
  1. 提交作業(yè)
  2. 查看作業(yè)成績(jī)
  3. 一個(gè)學(xué)員可以同時(shí)屬于多個(gè)班級(jí),就像報(bào)了Linux的同時(shí)也可以報(bào)名Python一樣, 所以提交作業(yè)時(shí)需先選擇班級(jí),再選擇具體上課的節(jié)數(shù)
  4. 附加:學(xué)員可以查看自己的班級(jí)成績(jī)排名

  

?

?

?

?

  

  

  

  

 

  

  

?

  

  

  

?

  

分類(lèi):?Python自動(dòng)化開(kāi)發(fā)之路 好文要頂?關(guān)注我?收藏該文?? 金角大王
關(guān)注 - 0
粉絲 - 639 +加關(guān)注 0 0 ??上一篇:Python Select 解析 posted @?2016-10-19 18:35?金角大王?閱讀(636) 評(píng)論(0) ?編輯?收藏

刷新評(píng)論刷新頁(yè)面返回頂部

轉(zhuǎn)載于:https://www.cnblogs.com/weiman3389/p/6222369.html

總結(jié)

以上是生活随笔為你收集整理的python 之路,Day11 (下)- sqlalchemy ORM的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。