官方文檔
http://docs.sqlalchemy.org/en/rel_1_0/
不錯的文章
http://gashero.yeax.com/?p=6
http://www.jianshu.com/p/152685de2533
概述
SQLAlchemy 是python 操作資料庫的一個庫。提供了2種方式操控資料庫(官方文檔可以看見分為SQLAlchemy ORM 與SQLAlchemy Core)。一種是ORM(使用類定義資料表),另一種可以說就是打包好的友善使用的sql語句Core(使用表格定義表)。
安裝
pip install SQLAlchemy
SQLAlchemy Core
先說說core方式。
先連接配接資料庫,連接配接資料庫ORM跟Core方式都都一樣
from sqlalchemy import create_engine
engine = create_engine('sqlite:///db.sqlite3',echo=True)
echo=True表示運作時,進行CURD操作時會顯示對應sql語句
然後定義元資訊并建立表格
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
metadata = MetaData()
users = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('fullname', String),
)
addresses = Table('addresses', metadata,
Column('id', Integer, primary_key=True),
Column('user_id', None, ForeignKey('users.id')),
Column('email_address', String, nullable=False)
)
綁定到引擎并初始化資料庫
metadata.create_all(engine)
現在表就建立好了
插入資料
ins = users.insert()
str(ins)
你可以看到ins其實就是一個sql的insert語句
就下了就要執行ins,有很多中方式
ins = ins.values(name='jack', fullname='Jack Jones')
conn = engine.connect()
result = conn.execute(ins)
或者
conn = engine.connect()
conn.execute(ins, name='wendy', fullname='Wendy Williams')
或者
ins.bind = engine
ins.execute(name="bill",fullname="billvsme")
或者
metadata.bind = engine
ins.execute(name="bill",fullname="billvsme")
插入多條資料
conn = engine.connect()
conn.execute(users.insert(),[
{'name':'my01','fullname':'mymy01'},
{'name':'my02','fullname':'mymy02'},
{'name':'my02','fullname':'mymy02'},
]
)
select
s=users.select()
result=s.execute()
for row in result:
print row
或者
from sqlalchemy.sql import select
s = select([users])
result = conn.execute(s)
for row in result:
print row
選擇字段
s = select([users.c.name, users.c.fullname])
多張表的select
s = select([users,address])
連接配接
s = select([users, addresses]).where(users.c.id == addresses.c.user_id)
剩下的看文檔
SQLAlchemy ORM
使用 ORM 就是 将 python class 與 資料庫的 table 映射,免去直接寫 sql 語句建立映射
定義表的model
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (
self.name, self.fullname, self.password)
user.__table__ 可以檢視對應的table
建立表
Base.metadata.create_all(engine)
建立會話
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
添加
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)
session.commit()
添加多條
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')]
)
Query
for instance in session.query(User).order_by(User.id):
print instance.name, instance.fullname
其餘的看文檔