SQLAlchemy簡單入門

SQlAlchemy簡單使用

sqlalchemy介紹

SQLAlchemy的是Python的SQL工具包和對象關系映射器媳友,讓應用程序開發(fā)人員可以使用上SQL的強大功能和靈活性刃唤。
它提供了一套完整的企業(yè)級持久化模式戈盈,專為高效率和高性能的數(shù)據(jù)庫訪問而設計著洼,簡單易用用液肌,專門為Python語言而準備啥繁。

SQLAlchemy的理念

SQL數(shù)據(jù)庫與對象集合目標不同唱蒸,它需要關注更大的數(shù)據(jù)容量與更高的性能;而對象集合則和數(shù)據(jù)表或數(shù)據(jù)行的目標不同幻林,它需要更好的數(shù)據(jù)抽象终吼。 SQLAlchemy設計的目的镀赌,就是適配這兩個原則。

SQLAlchemy把數(shù)據(jù)庫當作是一個關系型代數(shù)引擎际跪,不只是數(shù)據(jù)表的一個集合商佛。數(shù)據(jù)行不僅可以從數(shù)據(jù)表中查詢出來,也可以從數(shù)據(jù)表關聯(lián)后成形成的邏輯數(shù)據(jù)表和其他的查詢語句結果中進行查詢;這些元素可以組合形成更大的數(shù)據(jù)結構姆打。 SQLAlchemy的表達式語言就是建立在這個核心概念之上的良姆。

SQLAlchemy組件中最有名的是它的對象關系映射器(ORM),是一個提供數(shù)據(jù)映射器模式的可選組件幔戏,利用這個組件玛追,類可以以開放式的多種方式映射到數(shù)據(jù)庫上,允許對象模型的設計和數(shù)據(jù)庫架構的設計闲延,一開始就以分離方式進行各自的開發(fā)痊剖。實現(xiàn)松耦合的架構.

sqlalchemgy文檔

獨處
連接數(shù)據(jù)庫
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker


DB_CONNECT_STRING = 'mysql+mysqldb://root:123@localhost/mydb?charset=utf8'
engine = create_engine(DB_CONNECT_STRING)
DB_Session = sessionmaker(bind=engine)
session = DB_Session()

上面的DB_CONNECT_STRING是連接數(shù)據(jù)庫的路徑,這個路徑也就是database_urls包含了使用的數(shù)據(jù)庫驅動以及數(shù)據(jù)庫的連接信息等.一般格式是:dialect+driver://username:password@host:port/database
下面給出其他形式的數(shù)據(jù)庫連接示例:

# default
engine = create_engine('postgresql://scott:tiger@localhost/mydatabase')

# psycopg2
engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase')

# pg8000
engine = create_engine('postgresql+pg8000://scott:tiger@localhost/mydatabase')


# default
engine = create_engine('mysql://scott:tiger@localhost/foo')

# mysql-python
engine = create_engine('mysql+mysqldb://scott:tiger@localhost/foo')

# MySQL-connector-python
engine = create_engine('mysql+mysqlconnector://scott:tiger@localhost/foo')

# OurSQL
engine = create_engine('mysql+oursql://scott:tiger@localhost/foo')
直接操作sql
sql= 'show tables'
session.execute(sql)
result = session.excute(sql).fetchall()

sql = 'create database test'
session.excute(sql)

以上使用sqlalchemy直接執(zhí)行sql語句,這和mysql-python沒有任何區(qū)別.當然,需要注意在事務操作中,記得commit.在操作很復雜的sql語句,不能映射到對應的ORM上,這是備用選項.

下面開始介紹sqlalchemy的ORM.從數(shù)據(jù)庫的增刪查改.

關聯(lián)一個數(shù)據(jù)表
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer

engine = create_engine('mysql+mysqldb://root:youdi@localhost:3306/alchemy?charset=utf8')
Base = declarative_base()

class User(Base):

    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column('username',String(64), nullable=False)
    password = Column(String(64), nullable=False)

    email = Column(String(64), nullable=False)

    def __repr__(self):
        return '%s(%r)' % (self.__class__.__name__, self.username)
插入數(shù)據(jù)
import User
from sqlalchemy.orm import sessionmaker
session = sessionmaker(bind=engine)
mysql = session()

user1 = User()
user1.id = 2
user1.name = 'hello'
user1.email = '123@gmail.net'
user1.password = 'password'

mysql.add(user1)

user2 = User(id=3,name='youmi',password='1234',email='12@you.net')

mysql.add(user2)

mysql.commit()

上面插入了兩條數(shù)據(jù)

mysql> select * from users;
+----+----------+----------+---------------+
| id | username | password | email         |
+----+----------+----------+---------------+
|  2 | hello    | password | 123@gmail.net |
|  3 | youmi    | 1234     | 12@you.net    |
+----+----------+----------+---------------+
2 rows in set (0.02 sec)

查詢表中的數(shù)據(jù)

1.查詢所有的數(shù)據(jù)

如同select * from tb_name

query = mysql.query(User)
sql = str(query) # 執(zhí)行的sql語句
sql = query.statement # 執(zhí)行的sql語句

users_name = []
for i in query:  #遍歷時查詢
    users_name.append(i.name)

query.all() #返回所有對象的列表
query.first() #返回第一個對象,記錄不存在時,first() 會返回 None
query.one()  # 不存在垒玲,或有多行記錄時會拋出異常

另外,query也可以使用User直接獲得
query = User.query
2.顯示指定字段的數(shù)據(jù)

如同: select name,id from users

names = mysql.query(User.name)
names.all() #每行都是一個元組
3.篩選條件

limit

mysql.query(User).limit(10)
User.query.limit(10)

offset

offset = 10
mysql.query(User).offset(offset).limit(10)
# or
User.query.offset(offset).limit(10)

oder by

mysql.query(User).order_by('id')
mysql.query(User).order_by(User.id.desc())
mysql.query(User).order_by('id asc')
mysql.query(User).order_by(User.name.desc(),User.id)

filter
sql中的where后面的條件

mysql.query(User).filter(User.id == 1).scalar()
# or 使用字面量
mysql.query(User).filter('id = 1').scalar()
# 多個條件
mysql.query(User).filter(User.id > 1,User.name != 'youmi').scalar()
# in條件
mysql.query(User).filter(User.id.in_((1,2,3))).scalar()

# or條件需要導入or_()函數(shù)
mysql.query(User).filter(or_(User.id > 1,User.name != 'youmi')).scalar()

補充(所有的額外函數(shù)):
其中func映射到sql中的很多函數(shù),如:count,sum,now,current_timestamp,md5等等,
其他的函數(shù),有case對應sql中when case

from .sql import (
    alias,
    and_,
    asc,
    between,
    bindparam,
    case,
    cast,
    collate,
    delete,
    desc,
    distinct,
    except_,
    except_all,
    exists,
    extract,
    false,
    func,
    insert,
    intersect,
    intersect_all,
    join,
    literal,
    literal_column,
    modifier,
    not_,
    null,
    or_,
    outerjoin,
    outparam,
    over,
    select,
    subquery,
    text,
    true,
    tuple_,
    type_coerce,
    union,
    union_all,
    update,
    )
4.聯(lián)表查詢(join)

INNER JOIN

query = User.query.join(Group, User.gid == Group.id)
.filter(User.id != None,"is_superuser & 1 = 1")
.order_by(User.last_edit.asc()).limit(10)

LEFT JOIN

query = User.query.outerjoin(Group, User.gid == Group.id)
.filter(User.id != None,"is_superuser & 1 = 1")
.order_by(User.last_edit.asc()).limit(10)

RIGHT JOIN

query = User.query.outerjoin(Group, User.gid == Group.id)
.filter(User.id != None,"is_superuser & 1 = 1")
.order_by(User.last_edit.asc()).limit(10)

其他的連接方式,需要自己指定參數(shù),可以靈活的操作:

    def join(self, right, onclause=None, isouter=False, join_to_left=None):
        return _ORMJoin(self, right, onclause, isouter)

    def outerjoin(self, right, onclause=None, join_to_left=None):
        return _ORMJoin(self, right, onclause, True)

修改數(shù)據(jù)

mysql.query(User).filter(User.id == 1).update({User.name:'youmi'})

# or 
user = mysql.query(User).filter(User.id == 1)
user.name = 'test'
mysql.flush() #寫入數(shù)據(jù)庫,但并沒有提交

刪除數(shù)據(jù)

mysql.query(User).filter(User.id == 1).delete()
mysql.commit()
心 * 自由

不過相比Django的ORM.sqlalchemy對sql的支持更好.
上面只是簡單的介紹了sqlalchemy的增刪查改,需要更加深入的特性,可以查看官方文檔,或者查看源碼.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末陆馁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子合愈,更是在濱河造成了極大的恐慌叮贩,老刑警劉巖击狮,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異益老,居然都是意外死亡彪蓬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門捺萌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來档冬,“玉大人,你說我怎么就攤上這事互婿〉方迹” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵慈参,是天一觀的道長呛牲。 經(jīng)常有香客問我,道長驮配,這世上最難降的妖魔是什么娘扩? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮壮锻,結果婚禮上琐旁,老公的妹妹穿的比我還像新娘。我一直安慰自己猜绣,他們只是感情好灰殴,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掰邢,像睡著了一般牺陶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辣之,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天掰伸,我揣著相機與錄音,去河邊找鬼怀估。 笑死狮鸭,一個胖子當著我的面吹牛,可吹牛的內容都是我干的多搀。 我是一名探鬼主播歧蕉,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼康铭!你這毒婦竟也來了廊谓?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤麻削,失蹤者是張志新(化名)和其女友劉穎蒸痹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呛哟,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡叠荠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扫责。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榛鼎。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鳖孤,靈堂內的尸體忽然破棺而出者娱,到底是詐尸還是另有隱情,我是刑警寧澤苏揣,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布黄鳍,位于F島的核電站,受9級特大地震影響平匈,放射性物質發(fā)生泄漏框沟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一增炭、第九天 我趴在偏房一處隱蔽的房頂上張望忍燥。 院中可真熱鬧,春花似錦隙姿、人聲如沸梅垄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽队丝。三九已至,卻和暖如春饲嗽,著一層夾襖步出監(jiān)牢的瞬間炭玫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工貌虾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吞加,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓尽狠,卻偏偏與公主長得像衔憨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袄膏,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容

  • 轉載践图,覺得這篇寫 SQLAlchemy Core,寫得非常不錯沉馆。不過后續(xù)他沒寫SQLAlchemy ORM... ...
    非夢nj閱讀 5,414評論 1 14
  • URL與視圖 URL與函數(shù)的映射: 從之前的helloworld.py文件中码党,我們已經(jīng)看到德崭,一個URL要與執(zhí)行函數(shù)...
    編程小蟬閱讀 2,774評論 1 19
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法揖盘,內部類的語法眉厨,繼承相關的語法,異常的語法兽狭,線程的語...
    子非魚_t_閱讀 31,644評論 18 399
  • <魔神相克者>憾股;(本作原名) アスラクレイン ,Asura Cryin'箕慧, Asura就是印度教神話中的阿修羅服球,是...
    空白_7閱讀 1,111評論 0 0
  • 羈羈絆羈羈,朝朝辭舊夕颠焦。 人人偎人人斩熊,雙雙入紅塵。
    不如喫茶去閱讀 133評論 0 0