SQLAlchemy 是python操做數據庫的最好用的一個庫,可以進行ORM映射.它爲高效和高性能的數據庫訪問設計,實現了完整的企業級持久模型。SQLAlchemy的理念是,SQL數據庫的量級和性能重要於對象集合;而對象集合的抽象又重要於表和行。python
對數據庫的操做有傳統寫sql和ORM操做兩種方式, 不過我估計第二種應該是採用SQLAlchemy的主要緣由吧.sql
官方文檔爲: http://docs.sqlalchemy.org/en/rel_0_9/數據庫
一 安裝 SQLAlchemyflask
pip install sqlalchemy
導入若是沒有報錯則安裝成功session
>>> import sqlalchemy >>> sqlalchemy.__version__ '0.9.1' >>>
二 使用 sqlalchemy對數據庫操做
(1). 定義元信息,綁定到引擎app
>>> from sqlalchemy import * >>> from sqlalchemy.orm import * >>> engine = create_engine('sqlite:///./sqlalchemy.db', echo=True) # 定義引擎 >>> metadata = MetaData(engine) # 綁定元信息 >>>
(2).建立表格,初始化數據庫性能
>>> users_table = Table('users', metadata, ... Column('id', Integer, primary_key=True), ... Column('name', String(40)), ... Column('email', String(120))) >>> >>> users_table.create() 2014-01-09 10:03:32,436 INFO sqlalchemy.engine.base.Engine CREATE TABLE users ( id INTEGER NOT NULL, name VARCHAR(40), email VARCHAR(120), PRIMARY KEY (id) ) 2014-01-09 10:03:32,436 INFO sqlalchemy.engine.base.Engine () 2014-01-09 10:03:32,575 INFO sqlalchemy.engine.base.Engine COMMIT >>>
執行上述代碼,咱們就建立 一個 users 表,有id, name, email 三個字段設計
(env)ghost@ghost-H61M-S2V-B3:~/project/flask/fsql$ sqlite3 sqlalchemy.db SQLite version 3.7.13 2012-06-11 02:05:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .tables users sqlite>
(3). 基本操做,插入
若是已經table表已經存在, 第二次運行就不準要 create了, 使用 autoload 設置code
>>> from sqlalchemy import * >>> from sqlalchemy.orm import * >>> engine = create_engine('sqlite:///./sqlalchemy.db', echo=True) >>> metadata = MetaData(engine) >>> users_table = Table('users', metadata, autoload=True) 2014-01-09 10:20:01,580 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users") 2014-01-09 10:20:01,581 INFO sqlalchemy.engine.base.Engine () 2014-01-09 10:20:01,582 INFO sqlalchemy.engine.base.Engine PRAGMA foreign_key_list("users") 2014-01-09 10:20:01,583 INFO sqlalchemy.engine.base.Engine () 2014-01-09 10:20:01,583 INFO sqlalchemy.engine.base.Engine PRAGMA index_list("users") 2014-01-09 10:20:01,583 INFO sqlalchemy.engine.base.Engine () >>> users_table Table('users', MetaData(bind=Engine(sqlite:///./sqlalchemy.db)), Column('id', INTEGER(), table=<users>, primary_key=True, nullable=False), Column('name', VARCHAR(length=40), table=<users>), Column('email', VARCHAR(length=120), table=<users>), schema=None) >>>
實例化一個插入句柄orm
>> i = users_table.insert() >>> i <sqlalchemy.sql.dml.Insert object at 0x31bc850> >>> print i INSERT INTO users (id, name, email) VALUES (?, ?, ?) >>> i.execute(name='rsj217', email='rsj21@gmail.com') 2014-01-09 10:24:02,250 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, email) VALUES (?, ?) 2014-01-09 10:24:02,250 INFO sqlalchemy.engine.base.Engine ('rsj217', 'rsj21@gmail.com') 2014-01-09 10:24:02,251 INFO sqlalchemy.engine.base.Engine COMMIT <sqlalchemy.engine.result.ResultProxy object at 0x31bce10> >>> i.execute({'name': 'ghost'},{'name': 'test'}) 2014-01-09 10:24:57,537 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name) VALUES (?) 2014-01-09 10:24:57,537 INFO sqlalchemy.engine.base.Engine (('ghost',), ('test',)) 2014-01-09 10:24:57,537 INFO sqlalchemy.engine.base.Engine COMMIT <sqlalchemy.engine.result.ResultProxy object at 0x31bcd50> >>>
數據庫內容爲
sqlite> select * from users; 1|rsj217|rsj21@gmail.com 2|ghost| 3|test| sqlite>
查詢 刪除和插入相似 都須要先實例一個 sqlalchemy.sql.dml 對象
三 使用 ORM
使用 orm 就是 將 python class 與 數據庫的 table 映射,免去直接寫 sql 語句
建立映射
>>> class User(object): ... def __repr__(self): ... return '%s(%r, %r)' % (self.__class__.__name__, self.name, self.email) ... >>> mapper(User, users_table) # 建立映射 <Mapper at 0x31bcfd0; User> >>> ul = User() >>> ul.name >>> print ul User(None, None) >>> print ul.name None >>>
創建會話
查詢
>>> session = create_session() >>> session <sqlalchemy.orm.session.Session object at 0x31bef10> >>> query = session.query(User) >>> query <sqlalchemy.orm.query.Query object at 0x31bee50> >>> u = query.filter_by(name='rsj217').first() 2014-01-09 10:44:23,809 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.email AS users_email FROM users WHERE users.name = ? LIMIT ? OFFSET ? 2014-01-09 10:44:23,809 INFO sqlalchemy.engine.base.Engine ('rsj217', 1, 0) >>> u.name u'rsj217' >>>
插入
>>> from sqlalchemy import * >>> from sqlalchemy.orm import * >>> engine = create_engine('sqlite:///./sqlalchemy.db') >>> metadata = MetaData(engine) >>> users_table = Table('users', metadata, autoload=True) >>> class User(object): pass ... >>> mapper(User, users_table) <Mapper at 0x18185d0; User> >>> Session = sessionmaker(bind=engine) >>> session = Session() >>> u = User() >>> u.name = 'new' >>> session.add(u) >>> session.flush() >>> session.commit() >>>
注意創建會話的方式, sqlalchemy 的版本不一樣 sessionmaker 的方式更好 剩下刪除 關係 事物等高級操做就參考官方文檔了.