zoukankan      html  css  js  c++  java
  • 一篇搞定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)
    

     

      

      

      

      

      

      

      

  • 相关阅读:
    第 5 章 Nova
    第 5 章 Nova
    第 5 章 Nova
    第 5 章 Nova
    第 5 章 Nova
    第 5 章 Nova
    第 5 章 Nova
    vba:提取字符串中间字符
    vba:根据给定单元格搜索目标值
    vba:合并当前目录下所有工作簿的全部工作表
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/7076475.html
Copyright © 2011-2022 走看看