一篇搞定SQLAlchemy--关系对象映射

  要使用SQLAlchemy,必须先下载这个模块

  • pip3 install sqlalchemy 或 pycharm File--> Settings-->project...-->Project Interpreter-->右上+-->搜索你要安装的模块
  • 源码安装,源码下载地址:https://www.oschina.net/news/84998/sqlalchemy-1-1-10

  开始操作前,你必须清楚SQLAlchemy实现操作数据库的原理,SQLAlchemy本身是无法操作数据库的,必须通过第三库pymysql,而SQAlchemy内的Dialect就是用来和数据API进行交流的,实现过程就是利用python最为常用的类和对象来,一张表就是一个类,一行数据就是一个对象

  了解到这,就是开始我们的实战吧!利用ORM(关系对象映射)创建表,分5步走

  第一步:导模块

#导模块
#用于和数据库创建连接
from sqlalchemy import create_engine
#用于实例一个基类,创建表时必须继续这个父类
from  sqlalchemy.ext.declarative import declarative_base
#导入表元素,列,数据类型,外键,索引..
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index

   第二步:创建数据库连接

  数据传入格式mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

#连接数据库,在这里传入你要使用的数据库类型和第三方操作数据库的模块
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/db1",echo=True,max_overflow=5)

   第三步:创建基类

  创建表类时 ,必须继承这个类

#创建基类
Base = declarative_base()

   第四步:创建表,记得要继承基类

#创建表类
class Users(Base):
    __tablename__ = 'users'
    nid = Column(Integer,primary_key=True)
    name = Column(String(32))
    extra = Column(String(16))

    __table_args__ = (
        UniqueConstraint('nid','name',name='uix_nid_name'),
        Index('ix_name_extra','name','extra'),
    )

   第五步:

#由于上面只是在代码级别实现,还没真正的创建表,所有还需一个执行动作
Base.metadata.create_all(engine)

 全部代码:

# usr/bin/env python
# -*- encoding:utf-8 -*-

#导模块
#用于和数据库创建连接
from sqlalchemy import create_engine
#用于实例一个基类,创建表时必须继续这个父类
from  sqlalchemy.ext.declarative import declarative_base
#导入表元素,列,数据类型,外键,索引..
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index

#连接数据库,在这里传入你要使用的数据库类型和第三方操作数据库的模块
engine = create_engine("mysql+pymysql://root:lpfendou2015,,@127.0.0.1:3306/db1",echo=True,max_overflow=5)

#创建基类
Base = declarative_base()

#创建表类
class Users(Base):
    __tablename__ = 'users'
    nid = Column(Integer,primary_key=True)
    name = Column(String(32))
    extra = Column(String(16))

    __table_args__ = (
        UniqueConstraint('nid','name',name='uix_nid_name'),
        Index('ix_name_extra','name','extra'),
    )


#由于上面只是在代码级别实现,还没真正的创建表,所有还需一个执行动作
Base.metadata.create_all(engine)
View Code

 

  一对多创建表,重点就是外键

#一对多
#外键关联的表要先创建
class Favor(Base):
    __tablename__ = 'favor'
    nid = Column(Integer,primary_key=True)
    caption = Column(String(50),default='red',unique=True)

class Person(Base):
    __tablename__ = 'person'
    nid = Column(Integer,primary_key=True)
    name = Column(String(32),index=True,nullable=True)
    favor_id = Column(Integer,ForeignKey('favor.nid'))

   多对多创建表

#多对多,需要创建三张表
class Group(Base):
    __tablename__ = 'group'
    nid = Column(Integer,primary_key=True)
    name = Column(String(64),unique=True,nullable=False)
    port = Column(Integer,default=22)

class Server(Base):
    __tablename__ = 'server'
    nid = Column(Integer,primary_key=True,autoincrement=True)
    hostname = Column(String(64),unique=True,nullable=False)

class ServerToGroup(Base):
    __tablename__ = 'servertogroup'
    nid = Column(Integer,primary_key=True,autoincrement=True)
    sever_id = Column(Integer,ForeignKey('server.nid'))
    group_id = Column(Integer,ForeignKey('group.nid'))

 

   删除所有的表

    Base.metadata.drop_all(engine)

 完整代码

# usr/bin/env python
# -*- encoding:utf-8 -*-

#导模块
#用于和数据库创建连接
from sqlalchemy import create_engine
#用于实例一个基类,创建表时必须继续这个父类
from  sqlalchemy.ext.declarative import declarative_base
#导入表元素,列,数据类型,外键,索引..
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index

#连接数据库,在这里传入你要使用的数据库类型和第三方操作数据库的模块
engine = create_engine("mysql+pymysql://root:lpfendou2015,,@127.0.0.1:3306/db1",echo=True,max_overflow=5)

#创建基类
Base = declarative_base()

#创建表类
class Users(Base):
    __tablename__ = 'users'
    nid = Column(Integer,primary_key=True)
    name = Column(String(32))
    extra = Column(String(16))

    __table_args__ = (
        UniqueConstraint('nid','name',name='uix_nid_name'),
        Index('ix_name_extra','name','extra'),
    )

#一对多
#外键关联的表要先创建
class Favor(Base):
    __tablename__ = 'favor'
    nid = Column(Integer,primary_key=True)
    caption = Column(String(50),default='red',unique=True)

class Person(Base):
    __tablename__ = 'person'
    nid = Column(Integer,primary_key=True)
    name = Column(String(32),index=True,nullable=True)
    favor_id = Column(Integer,ForeignKey('favor.nid'))

#多对多,需要创建三张表
class Group(Base):
    __tablename__ = 'group'
    nid = Column(Integer,primary_key=True)
    name = Column(String(64),unique=True,nullable=False)
    port = Column(Integer,default=22)

class Server(Base):
    __tablename__ = 'server'
    nid = Column(Integer,primary_key=True,autoincrement=True)
    hostname = Column(String(64),unique=True,nullable=False)

class ServerToGroup(Base):
    __tablename__ = 'servertogroup'
    nid = Column(Integer,primary_key=True,autoincrement=True)
    sever_id = Column(Integer,ForeignKey('server.nid'))
    group_id = Column(Integer,ForeignKey('group.nid'))

#由于上面只是在代码级别实现,还没真正的创建表,所有还需一个执行动作
def init_db():
    Base.metadata.create_all(engine)

def drop_db():
    Base.metadata.drop_all(engine)
View Code

 

操作表

  在操作之前,还需要做两步

  第一步:导模块

#操作表时用到,sessionmaker用于实例操作表的对象,relationship在表类中定义,方便查询
from sqlalchemy.orm import sessionmaker,relationship

    第二步:创建操作对象

Session = sessionmaker(bind=engine)
session = Session()

 

  增 add  add_all(列表)

#增
obj = Users(name='alex0',extra='sb')
session.add(obj)
session.add_all([
    Users(name='alex1',extra='sb'),
    Users(name='alex2',extra='sb')
])
session.commit()

   删 delete

#删除
session.query(Users).filter(Users.nid>2).delete()
session.commit()

   改 update

#改
session.query(Users).filter(Users.nid<2).update({Users.name:Users.name + '666'},synchronize_session=False)
session.commit()

   查 filter  filter_by

#查
r = session.query(Users).all()
print(r)
r2 = session.query(Users.name,Users.extra).all()
print(r2)
r3 = session.query(Users).filter_by(nid=2).all()
print(r3)
r4 = session.query(Users).filter_by(name='alex').first()
print(r4)

 

 

 

 

  

  

  

  

  

  

  

posted @ 2017-06-25 17:48  财经知识狂魔  阅读(3255)  评论(0编辑  收藏  举报