先看一下sqlalchemy框架中的映射,sqlalchemy一共有三種映射方式:傳統映射(classic)、
現代化映射(modern)、自定義映射。
在這裏,只爲大家講一下classic映射和modern映射。
classic映射:
顧名思義,就是類似於hibernate那樣,要寫好多配置文件,這裏放一個小例子:
#coding=utf-8 from sqlalchemy import Table, MetaData, Column, Integer, String, DateTime from datetime import datetime from sqlalchemy.engine import create_engine '''''與數據庫建立鏈接''' engine = create_engine("mysql://username:password@databasehost/databasename",isolation_level="READ UNCOMMITTED") '''''數據庫表與對象之間的映射關係,類於hibernate中的xml配置文件''' metadata = MetaData() people = Table( #people 'people', metadata, Column('id', Integer, primary_key=True), Column('name', String(16), unique=True, nullable=False), Column('gender', String(255), unique=True, nullable=True), Column('created', DateTime, default=datetime.now) ) student = Table( #student 'student', metadata, Column('id', Integer, primary_key=True), Column('name', String(16), unique=True, nullable=False), Column('gender', String(255), unique=True, nullable=True), Column('created', DateTime, default=datetime.now) ) teacher = Table( #teacher 'teacher', metadata, Column('id', Integer, primary_key=True), Column('name', String(16), unique=True, nullable=False), Column('gender', String(255), unique=True, nullable=True), Column('created', DateTime, default=datetime.now) ) '''''創建數據庫的類''' class People(object):pass class Student(object):pass class Teacher(object):pass '''''傳統映射方式''' mapper(People,people) mapper(Student,student) mapper(Teacher,teacher) '''''創建表''' metadata.create_all(engine)
此時,如果我們再寫一個*.py文件
代碼如下:
from dbproject.dbsetting import People,Teacher,engine from sqlalchemy.orm import sessionmaker people = People() teahcer = Teacher() people.name='renlei' people.id=1 teahcer.name='laoshi' teahcer.id=1 Session = sessionmaker() Session.configure(bind=engine) session = Session() session.add(people) session.add(teahcer) session.flush() session.commit()
編譯運行這個python文件,就會發現數據庫中的信息發生了相應變化。
modern映射:
如下,先寫一個modern.py文件,代碼:
#coding=utf-8 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String from sqlalchemy.engine import create_engine '''與數據庫建立鏈接''' engine = create_engine("mysql://username:password@databasehost/databasename",isolation_level="READ UNCOMMITTED") '''數據庫表結構''' Base = declarative_base() class People():#定義一個基類當然也可以不定義,這裏只是給個例子 id = Column(Integer, primary_key=True) name = Column(String(16)) gender = Column(String(16)) age = Column(String(16)) class User(Base,People): __tablename__ = 'users' fullname = Column(String(16)) password = Column(String(16)) class AdvancedUser(Base,People): __tablename__ = 'advanceduser' fullname = Column(String(16)) password = Column(String(16)) email = Column(String(16)) class Teacher(Base,People): __tablename__ = 'teacher' phone = Column(String(16)) #創建所有的表 Base.metadata.create_all(engine)
接入來再寫一個control.py文件,代碼:
#coding=utf-8 from sqlalchemy.orm.session import sessionmaker from modern import engine,User,AdvancedUser,Teacher user = User() user.name = 'username' user.gender = 'male' au = AdvancedUser() au.name = 'auname' au.gender = 'female' teacher = Teacher() teacher.name = 'wangdi' teacher.gender = 'female' teacher.phone = '15264397652' Session = sessionmaker() Session.configure(bind=engine) session = Session() session.add(user) session.add(au) session.add(teacher) session.flush() session.commit()
編譯執行代碼,會發現數據庫內信息有變化,怎麼樣,與classic映射相比,這種寫法是不是更方便啊。
這樣,我們就可以省去大量的sql語句,直接使用python代碼來完成。