SQLAlchemy之SQL Expression
SQLAlchemy是一個強大的Python SQL工具箱, 提供了包括ORM在內的各種支持.
首先使用pip安裝;
pip install SQLAlchemy
SQL Expression Language 是SQLAlchemy Core的組成部分, 提供了與SQL類似的API而避免了直接書寫SQL語句.
連接數據庫
使用下列語句連接數據庫:
from sqlalchemy import create_engine engine = create_engine("mysql://root:passwd@localhost:3306/webpy?charset=utf8", echo=True)create_engine的第一個參數的格式為:
數據庫類型://用戶名:密碼@數據庫主機地址/數據庫名?編碼沒有密碼則為空,不填; echo=True則在終端進行回顯, 默認為False.
engine可以直接執行sql語句:
engine.execute("SELECT * FROM user")如果需要事務性操作則需要使用connect:
conn = engine.connect() result = conn.execute("SELECT * FROM user")Create Table
使用metadata和Table類來定義表:
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey import MySQLdbengine = create_engine("mysql://root:password@localhost:3306/test?charset=utf8", encoding="utf-8", echo=True)metadata = MetaData()# define user = Table('user', metadata,Column('user_id', Integer, primary_key=True),Column('name', String(20)),)# do create and commit metadata.create_all(engine)回顯信息:
... INFO sqlalchemy.engine.base.Engine CREATE TABLE user (user_id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY (user_id) ) .... INFO sqlalchemy.engine.base.Engine COMMITInsert
使用engine.connect()來執行:
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey import MySQLdbengine = create_engine("mysql://root:password@localhost:3306/test?charset=utf8", encoding="utf-8", echo=True)metadata = MetaData()user = Table('user', metadata,Column('user_id', Integer, primary_key=True),Column('name', String(20)),Column('fullname', String(40)),)conn = engine.connect() i = user.insert() u = {'name': 'yichya'} result = conn.execute(i, **u)select
仍然使用conn對象, 先做一個select * from user
conn = engine.connect() s = user.select() result = conn.execute(s) print (result.fetchall() )回顯:
INFO sqlalchemy.engine.base.Engine SELECT user.user_id, user.name, user.fullname FROM user INFO sqlalchemy.engine.base.Engine () [(1L, u'yichya', None)]可以使用for-each遍歷結果集:
>>>for raw in result: ... print(raw) INFO sqlalchemy.engine.base.Engine () (1L, u'yichya', None) (2L, u'finley', None) (3L, u'yy', None) (4L, u'godess', None)使用user的column對象可以自定義查詢的字段
>>>print(user.c) ['user.user_id', 'user.name', 'user.fullname']注意select不是從user對象中獲得的:
from sqlalchemy.sql import select conn = engine.connect() s = select([user.c.user_id, user.c.name]) result = conn.execute(s) print (result.fetchall() )可以在終端看到:
INFO sqlalchemy.engine.base.Engine SELECT user.user_id, user.name FROM user INFO sqlalchemy.engine.base.Engine () [(1L, u'yichya'), (2L, u'finley'), (3L, u'yy'), (4L, u'godess')]使用where()篩選記錄:
from sqlalchemy.sql import select conn = engine.connect() s = select([user.c.name]).where(user.c.name == 'yy') result = conn.execute(s) print(result.fetchall() )可以看到回顯:
INFO sqlalchemy.engine.base.Engine SELECT user.name FROM user WHERE user.name = %sINFO sqlalchemy.engine.base.Engine ('yy',) [(u'yy',)]實際上user.c重載了各種運算符:
>>>print(user.c.name == None) "user".name IS NULLwhere支持的運算符包括: > < <= >= == 和 != , 邏輯符and,or, not需要用下述方法:
>>>from sqlalchemy.sql import and_ >>>print(and_(user.c.user_id == address.c.user_id, address.c.city == 'New York') ) "user".user_id = address.user_id AND address.city = :city_1順便展示了多表連接查詢, 也可以使用join進行查詢:
>>>s = select([user.c.name, address.c.email]).select_from(user.join(address, user.c.user_id==address.c.user_id)) >>>print s SELECT "user".name, address.email FROM "user" JOIN address ON "user".user_id = address.user_id更多的查詢請參見,文末的參考鏈接.
Update
仍然使用connect執行:
conn = engine.connect() u = user.update().where(user.name == 'yichya').values(name='aa') result = conn.execute(u)Delete
delete也很簡單:
>>>d = user.delete().where(user.c.name == 'yichya') >>>conn.execute(d) INFO sqlalchemy.engine.base.Engine DELETE FROM user WHERE user.name = %s INFO sqlalchemy.engine.base.Engine ('yichya',) INFO sqlalchemy.engine.base.Engine COMMIT參考資料:
sqlalchemy docs latest
SQLAlchemy 簡單筆記
使用SQLAlchemy-廖雪峰
總結
以上是生活随笔為你收集整理的SQLAlchemy之SQL Expression的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PL/SQL异常处理(原创)
- 下一篇: AGS API for JavaScri