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