天天看點

sqlalchemy 根據官方文檔整理的知識點(還有待補充)

1、導入sqlalchemy并檢視版本

import sqlalchemy

printf(sqlalchemy.version)

2、資料庫連接配接(這裡使用mysql database)

from sqlalchemy import create_engine

create_engine("mysql+pymysql://root:1qaz#[email protected]/db_ttr", encoding="utf-8", echo=True)

說明:

mysql+pymysql

mysql 表示使用的mysql資料庫

pymysql 表示DBAPI,預設的DBAPI是mysqldb,可通過pip安裝pymysql或mysqldb

3、聲明一個映射

在使用ORM時,配置過程:1、首先描述我們要處理的資料庫表,2、然後定義我們自己的類

這些類将映射到這些表。在SQLAlchemy中,這兩個任務通常是一起執行的,使用一個名為Declarative,它允許我們建立包含訓示的類,用來描述它們将被映射到的實際資料庫表。

使用Declarative映射的類被定義為一個基類,它維護一個類和表相對于該基礎的目錄——這就是所謂的聲明基類。

在通常導入的子產品中,應用程式通常隻有一個執行個體。我們使用declarative_base()函數建立基類,如下所示:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base() #基類

現在我們有了一個“Base”,我們可以用它來定義任意數量的映射類。我們将從一個名為users的表開始,它将使用我們的應用程式存

儲最終使用者的記錄。一個名為User的新類将是我們映射該表的類。在這個類中,我們定義了将要映射的表的詳細資訊,

主要是表名,以及列的名稱和資料類型:

from sqlalchemy import Column, Integer, String

class User(Base): #User類是映射該表的類

tablename = 'users' #表名users

4、建立一個模式

通過使用聲明系統構造的使用者類,我們已經定義了關于表的資訊,即表中繼資料。

SQLAlchemy用來表示特定表的資訊的對象稱為table對象,這裡聲明性已經為我們做了一個。

通過檢查table屬性,我們可以看到這個對象:

In [10]: User.table

Out[10]: Table('users', MetaData(bind=None), Column('id', Integer(), table=<users>, primary_key=True, nullable=False), Column('name', String(), table=<users>), Column('fullname', String(), table=<users>), Column('password', String(), table=<users>), schema=None)

當我們聲明我們的類時,聲明使用Python元類,以便在類聲明完成後執行其他活動;在這個階段中,它根據我們的規範建立了一個表對象,

并通過構造一個Mapper對象将其與類關聯起來。這個對象是我們通常不需要直接處理的幕後對象(盡管它可以提供大量關于我們需要它的映射的資訊)。

表對象是一個稱為中繼資料的更大集合的成員。當使用聲明性的時候,這個對象可以使用。我們聲明基類的中繼資料屬性。中繼資料是一個系統資料庫,

它包括向資料庫發出有限的模式生成指令集的能力。由于我們的SQLite資料庫實際上沒有一個使用者表,是以我們可以使用中繼資料為所有不存在的表向資料庫發出CREATE table語句。

下面,我們調用MetaData.create_all()方法,将引擎作為資料庫連接配接的源傳遞。我們将看到,首先發出特殊指令來檢查users表的存在,

然後執行實際的CREATE table語句:

Base.metadata.create_all(engine) #執行實際的CREATE table語句,隻有執行了這個語句才會真正的在資料庫裡建立表和插入資料

5、建立映射類的一個執行個體

通過完成映射,現在讓我們建立并檢查一個使用者對象:

ed_user = User(name='tianran', fullname='tantianran', password='1qaz#EDC')

6、建立一個會話

現在我們可以開始與資料庫對話了。ORM對資料庫的“句柄”是會話。當我們第一次設定應用程式時,

在與create_engine()語句相同的級别上,我們定義了一個會話類,它将作為新會話對象的工廠:

>> from sqlalchemy.orm import sessionmaker >> Session = sessionmaker(bind=engine)

這個定制的會話類将建立綁定到我們資料庫的新會話對象。在調用sessionmaker時也可以定義其他事務特性;

這些将在後面的章節中描述。然後,每當需要與資料庫進行對話時,就執行個體化一個會話:

session = Session()

7、添加和更新對象

Session = sessionmaker(bind=engine)

session.add(ed_user)

在這一點上,我們說執行個體正在等待;還沒有發出SQL,而且該對象還沒有被資料庫中的一行表示。會話将會發出SQL,在需要的時候,使用被稱為“重新整理”的程序,将瓊斯盡快持久化。

如果我們為Ed Jones查詢資料庫,所有待處理的資訊将首先被重新整理,然後在此後立即發出查詢。

例如,在下面我們建立一個新的查詢對象,它加載使用者執行個體。我們“過濾”了ed的name屬性,

并指出我們隻希望第一個結果出現在完整的行清單中。傳回一個使用者執行個體,

它相當于我們添加的内容:

our_user = session.query(User).filter_by(name='ed').first() 

print(our_user)

我們可以使用add_all()添加更多的使用者對象:

session.add_all([

User(name='wendy', fullname='Wendy Williams', password='foobar'),

User(name='mary', fullname='Mary Contrary', password='xxg527'),

User(name='fred', fullname='Fred Flinstone', password='blah')]

)

如需要單獨更新一條記錄:

ed_user.password = 'f8s7ccs'

檢視哪些記錄是被修改過的:

session.dirty

檢視等待送出的對象

session.new

送出會話(隻有執行了這一步才會真在的将資料寫入到資料庫)

session.commit()

8、復原操作

session.rollback()

如做了一些修改,在沒有執行session.commit()之前,都可以進行復原操作

9、查詢

for instance in session.query(User).order_by(User.id):

print(instance.id,instance.name, instance.fullname, instance.password)

10、建立的過濾操作符

11、傳回清單和标量

待補充。。。。

12、使用文本sql

待補充。。。

13、計數

14、建立一個關系

本文轉自 TtrToby 51CTO部落格,原文連結:http://blog.51cto.com/freshair/2048610