有價值的參考文檔: http://www.jianshu.com/p/e6bba189fcbdhtml
官方參考網址: http://docs.sqlalchemy.org/en/rel_0_7/orm/relationships.htmljava
pip install sqlalchemy
python
使用create_engine
建立數據庫鏈接; 例子:mysql
from sqlalchemy import create_engine engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test') connect = engine.connect()
方法一:ios
from sqlalchemy import Table, MetaData, create_engine engine = create_engine("mysql+mysqlconnector://root:password@localhost:3306/test") metadata = MetaData(bind=engine) t1 = Table('users', metadata, Column('id',INT, primary_key=True), Column('name', String(20)), Column('fullname', String(50)), Column('password', String(20)) ) t2 = Table('address', metadata, Column('id',INT, primary_key = True), Column('email_address',String(50), nullable=False), Column('user_id', INT, ForeignKey('users.id')) ) t1.create() t2.create()
方法二sql
from sqlalchemy import Table, MetaData, create_engine engine = create_engine("mysql+mysqlconnector://root:password@localhost:3306/test") metadata = MetaData() t1 = Table('users', metadata, Column('id',INT, primary_key=True), Column('name', String(20)), Column('fullname', String(50)), Column('password', String(20)) ) t2 = Table('address', metadata, Column('id',INT, primary_key = True), Column('email_address',String(50), nullable=False), Column('user_id', INT, ForeignKey('users.id')) ) metadata.create_all(engine)
String
對象使用時,++必須聲明大小++,對應的是mysql數據庫的varchar
。數據庫
==區別==:方法一是直接在鏈接的基礎上定義了模式【直接將數據庫和模式對應】,而方法二先定義模式,侯江模式設置到特定的數據庫中。session
==重定義表結構==:在表定義的語句末尾添加
extend_existing=True
。函數
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, INT, String, ForeignKey from sqlalchemy.orm import backref,relationship Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(INT, primary_key=True) name = Column(String) fullname = Column(String) password = Column(String) class Address(Base): __tablename__ = "addresses" id = Column(INT, primary_key = True) email_address = Column(String, nullable = False) user_id = Column(INT, ForeignKey('users.id')) user = relationship('User', backref=backref('addresses',order_by=id))
Column
函數
primary_key
指定主鍵,nullable
指定元組是否能夠爲空(nullable = False
表示元組不準爲空)ForeignKey
指定外鍵約束,例如ForeignKey('users.id')
,表示addresses表外鍵約束users表的主鍵idrelatioship
函數[^2x]:將會告知ORM
經過Address.user,Address類自身必須連接到User類。relationship()使用兩個表的外鍵約束來斷定這種連接的性質。好比說斷定Address.user將會是多對一(many-to-one)關係。backref
函數[^2x]:它將提供一種用於反向查詢的細節,好比說在對象User上的Address對象集是經過User.addresses屬性引用,那麼多對一的關係(many-to-one)反向總會是一對多關係(one-to-many)。還有對於Address.user和User.addresses的關係來講老是雙向的。(通常與relationship函數結合使用。)使用sessionmaker
來綁定數據庫鏈接,並創建會話。code
例子:
from sqlalchemy import Column, String, create_engine from sqlalchemy.orm import sessionmaker engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test') Session = sessionmaker(bind = engine) session = Session()
==鏈接信息格式==:
數據庫類型+數據庫驅動名稱://用戶名:口令@機器地址:端口號/數據庫名
,若是碰到中文亂碼問題,可在後面加上?charset=utf8
。
==注意==:此處的session至關於java中的statement同樣,具備操做數據庫的句柄,能夠執行sql語句
session.execute("sql語句")
。
方法一:使用session執行sql語句方式
session.execute('insert into users values(2,"Bob","Bob hgf", "hgf")') session.commit()
方法二:使用映射類成員變量的數據
user = User(id="1", name="alice", fullname="alice hgf", password="hgf") session.add(user) session.commit()
users = session.query(User).all()
==說明==:上述語句返回全部的users表中的數據並以User對象的形式儲存在列表中。
for x in query: print x 結果: <__main__.User object at 0x36aa990> <__main__.User object at 0x36aaad0>
order_by
語句q = session.query(Address).order_by(desc(Address.user_id)) result = q.all() for x in result: print x.email_address
==說明==:執行查詢函數後,再使用
all()
函數,才能將結果映射成類的列表,類中儲存從數據庫中獲取的一行數據。
q = session.query(Address).filter(Address.user_id == 1) result = q.all() for x in result: print x.email_address
q = session.query(Address).join(Address.user).group_by(Address.id) result = q.all() for x in result: print x.email_address
q = session.query(func.avg(Address.id))
session.query(Address).filter(Address.user_id ==1).count()
session.query(Address).disdinct().count()
方法一:使用session執行sql語句方式
方法二:使用映射類成員變量的數據
session.query(Address).filter(Address.id ==4).delete() session.commit()
級聯刪除:在relationship關聯時要加上passive_deletes=True
外鍵要加上ondelete='CASCADE'
,不然sqlalchemy
不能級聯刪除。例如:
class MyClass(Base): __tablename__ = 'mytable' id = Column(Integer, primary_key=True) children = relationship("MyOtherClass", cascade="all, delete-orphan", passive_deletes=True) class MyOtherClass(Base): __tablename__ = 'myothertable' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('mytable.id', ondelete='CASCADE') )
方法一:使用session執行sql語句方式
session.execute('update addresses set user_id = 1 where id = 2') session.commit()
方法二:使用映射類成員變量的數據
session.query(Address).filter(Address.id == 2).update({"user_id": 1})
==注意==:
update
函數中的參數必須是字典類型
t1.drop() #t1是sqlalchemy.Table 對象,爲users表的定義 --- **{賀廣福}(heguangfu)**(tm) @2015-9-18