• sqlalchemy模块的基本使用


    Python中SQLAlchemy模块通过建立orm来对数据库进行操作

    1. 建表

      方式1

    # -*- coding:utf-8 -*-
    # Author:Wong Du
    
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, DATE
    
    # 建立镜像连接
    engine = create_engine("mysql+pymysql://caiyun:caiyun814@192.168.1.73/testdb")
    
    # 创建orm基类,用于建表结构继承使用
    Base = declarative_base()
    
    # 创建表Student类
    class Student(Base):
        __tablename__ = 'student'   # 表名
        id = Column(Integer, nullable=False, primary_key=True, autoincrement=True)
        name = Column(String(32), nullable=False)
        register_date = Column(DATE)
    
    
        # 让查询到的数据变得可读
        def __repr__(self):
            return "id:%s name:%s date:%s"
                   % (self.id, self.name, self.register_date)
    
    # 提交,创建表结构
    Base.metadata.create_all(engine)

      方式2

     1 # -*- coding:utf-8 -*-
     2 # Author:Wong Du
     3 
     4 from sqlalchemy import Table, create_engine
     5 from sqlalchemy import Column, Integer, String
     6 from sqlalchemy.ext.declarative import declarative_base
     7 
     8 # 建立镜像连接
     9 engine = create_engine("mysql+pymysql://root:root814@111.230.64.164/testdb", echo=True)
    10 
    11 # 创建orm基类,用于建表结构继承使用
    12 Base = declarative_base()
    13 
    14 # 建表
    15 user = Table(
    16     'user', Base.metadata,  # ‘user’为表名,通过Base的metadata方法建表
    17     Column('id', Integer, nullable=False, primary_key=True, autoincrement=True),
    18     Column('name', String(32), nullable=False),
    19     Column('password', String(64), nullable=False),
    20 )
    21 
    22 # 提交,创建表结构
    23 Base.metadata.create_all(engine)
    sqlalchemy_createTable2

      方式3

     1 # -*- coding:utf-8 -*-
     2 # Author:Wong Du
     3 
     4 from sqlalchemy import Table, MetaData, create_engine
     5 from sqlalchemy import Column, Integer, String
     6 
     7 # 创建镜像连接
     8 engine = create_engine("mysql+pymysql://root:root814@111.230.64.164/testdb", echo=True)
     9 
    10 # 创建orm对象
    11 metadata = MetaData()
    12 
    13 # 建表
    14 user = Table(
    15     'user2', metadata,
    16     Column('id', Integer, nullable=False, primary_key=True, autoincrement=True),
    17     Column('name', String(32), nullable=False),
    18     Column('password', String(64), nullable=False),
    19 )
    20 
    21 metadata.create_all(engine)
    sqlalchemy_createTable3

    2. sqlalchemy筛选表内容基本操作

    # -*- coding:utf-8 -*-
    # Author:Wong Du
    
    import sqlalchemy_createTable
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import func
    
    # 通过绑定镜像连接生成会话类
    Session_class = sessionmaker(bind=sqlalchemy_createTable.engine)
    # 生成会话对象
    session = Session_class()
    
    # 多条件查询,通过.query方法来查表,.filter方法来筛选表内容
    sel_obj = session.query(sqlalchemy_createTable.Student)
        .filter(sqlalchemy_createTable.Student.id>0)
        .filter(sqlalchemy_createTable.Student.id<5).first()
    
    # 查询所有数据
    sel_obj2 = session.query(sqlalchemy_createTable.Student).all()
    sel_obj3 = session.query(sqlalchemy_createTable.Student).filter().all()
    if sel_obj2 == sel_obj3:
        print("效果相同")
    
    # like匹配&统计
    sel_obj4 = session.query(sqlalchemy_createTable.Student)
        .filter(sqlalchemy_createTable.Student.name.like("%a%")).count()
    print(sel_obj4)
    
    # 分组统计
    sel_obj5 = session.query(
        sqlalchemy_createTable.Student.name,
        func.count(sqlalchemy_createTable.Student.name))
        .group_by(sqlalchemy_createTable.Student.name).all()
    print(sel_obj5)

    3. 其他操作

    # -*- coding:utf-8 -*-
    # Author:Wong Du
    
    import sqlalchemy_createTable
    from sqlalchemy.orm import sessionmaker
    
    # 创建与engine镜像连接的数据库交互的类
    Session_class = sessionmaker(bind=sqlalchemy_createTable.engine)
    # 生成会话实例
    session = Session_class()
    
    # 添加/插入表数据,创建要插入的数据对象
    ins_stu_obj = sqlalchemy_createTable.Student(name='zhangsan', register_date='2019-12-12')
    
    # 将要操作的数据对象添加到会话实例中
    session.add(ins_stu_obj)
    
    # 提交会话操作对象,使其真正生效
    session.commit()
    
    # 关闭会话实例
    session.close()
    
    
    # 查询表数据
    '''
    # filter_by关键字表达式,filter数据库SQL表达式,为空则匹配所有
    # .first()获取匹配的第一条查询数据,.all()获取匹配的所有数据
    # 格式1:session.query(表类名).filter_by(匹配关键字).first()
    # 格式2:session.query(表类名).filter(匹配SQL语句).all()
    # 获取查询到的表数据对象,为一个列表形式
    sel_stu_obj = session.query(sqlalchemy_createTable.Student).filter_by(name='zhangsan').first()
    sel_stu_obj2 = session.query(sqlalchemy_createTable.Student).filter(sqlalchemy_createTable.Student.id>0).all()
    print(sel_stu_obj)
    print(sel_stu_obj2)
    print(sel_stu_obj2[1].name)
    '''
    
    # 修改表数据
    '''
    # 获取要修改的表数据对象
    upd_stu_obj = session.query(sqlalchemy_createTable.Student).filter_by(name='zhangsan').first()
    print(upd_stu_obj)
    upd_stu_obj.name = 'ZhangSan'
    
    session.commit()
    sel = session.query(sqlalchemy_createTable.Student).filter_by().first()
    print(sel)
    
    session.close()
    '''
    
    # 回滚应用例子
    upd = session.query(sqlalchemy_createTable.Student).filter(sqlalchemy_createTable.Student.id==7).all()
    print(upd[0].register_date)
    upd[0].register_date = '2008-10-01'
    
    ins = sqlalchemy_createTable.Student(name='WangWu', register_date='2018-12-12')
    session.add(ins)
    
    print(session.query(sqlalchemy_createTable.Student).
          filter(sqlalchemy_createTable.Student.register_date.
                 in_(['2008-10-01', '2018-12-12'])).all())
    
    session.rollback()
    
    print(session.query(sqlalchemy_createTable.Student).
          filter(sqlalchemy_createTable.Student.register_date.
                 in_(['2008-10-01', '2018-12-12'])).all())

    4. 一对一外键

     1 # -*- coding:utf-8 -*-
     2 # Author:Wong Du
     3 
     4 from sqlalchemy import create_engine
     5 from sqlalchemy.ext.declarative import declarative_base
     6 from sqlalchemy import Column, Integer, String, ForeignKey
     7 from sqlalchemy.orm import sessionmaker, relationship
     8 
     9 # 创建镜像连接
    10 engine = create_engine("mysql+pymysql://caiyun:caiyun814@192.168.1.73/testdb?charset=utf8")
    11 # 创建orm基类
    12 Base = declarative_base()
    13 
    14 class User(Base):
    15     __tablename__ = 'user'
    16     id = Column(Integer, nullable=False, primary_key=True, autoincrement=True)
    17     name = Column(String(32), nullable=False)
    18     passwd = Column(String(64), nullable=False, default='123456')
    19 
    20     def __repr__(self):
    21         return "<id:%d name:%s passwd:%s>" 
    22                % (self.id, self.name, self.passwd)
    23 
    24 class Addr(Base):
    25     __tablename__ = 'addr'
    26     id = Column(Integer, nullable=False, primary_key=True, autoincrement=True)
    27     address = Column(String(32), default='X')
    28     u_id = Column(Integer, ForeignKey('user.id'), nullable=False)   # 配置外键
    29 
    30     # 通过sqlalchemy内部方法把两张表外键关联起来,从而实现不同表数据的互相调用
    31     user = relationship('User', backref='addr')
    32 
    33     def __repr__(self):
    34         return "<id:%d address:%s u_id:%d>" 
    35                % (self.id, self.address, self.u_id)
    36 
    37 
    38 Base.metadata.create_all(engine)
    39 
    40 
    41 '''
    42 --------------------------------------------------------------------------------------
    43                                    华丽分隔线
    44 --------------------------------------------------------------------------------------
    45 '''
    46 
    47 Session_class = sessionmaker(bind=engine)
    48 session = Session_class()
    49 
    50 # 插入
    51 ins_user = User(name='dudu', passwd='dudu814')
    52 # ins_user2 = User(name='hongfa', passwd='hongfa814')
    53 # ins_user3 = User(name='jinglin', passwd='jinglin814')
    54 #
    55 # ins_addr = Addr(address='guangzhou', u_id=1)
    56 # ins_addr2 = Addr(address='Guangdong', u_id=2)
    57 # ins_addr3 = Addr(address='shenzhen', u_id=3)
    58 # session.add_all( [ins_user, ins_user2, ins_user3,
    59 #             ins_addr, ins_addr2, ins_addr3] )
    60 # session.commit()
    61 
    62 sel_user = session.query(User).filter(User.name=='dudu').first()
    63 print(sel_user)
    64 print(sel_user.addr)
    65 print(sel_user.addr[0].address)
    66 
    67 print('33[33;1m华丽分隔线33[0m'.center(40, '-'))
    68 
    69 sel_addr = session.query(Addr).all()
    70 print(sel_addr)
    71 print(sel_addr[2])
    72 print(sel_addr[2].user)
    73 print(sel_addr[2].user.passwd)
    sqlalchemy_foreignkey

    5. 一对多外键

     1 # -*- coding:utf-8 -*-
     2 # Author:Wong Du
     3 
     4 from sqlalchemy import create_engine
     5 from sqlalchemy.ext.declarative import declarative_base
     6 from sqlalchemy import Column, Integer, String, ForeignKey
     7 from sqlalchemy.orm import sessionmaker, relationship
     8 
     9 engine = create_engine("mysql+pymysql://caiyun:caiyun814@localhost/testdb?charset=utf8")
    10 
    11 Base = declarative_base()
    12 
    13 
    14 class Taobao_addr(Base):
    15     __tablename__ = 'taobao_addr'
    16     id = Column(Integer, nullable=False, primary_key=True, autoincrement=True)
    17     addr = Column(String(32), nullable=False, server_default='XXXXXXXXXXXXXXX')
    18 
    19     def __repr__(self):
    20         return "<id:%d addr:%s>" 
    21                % (self.id, self.addr)
    22 
    23 class Taobao_user(Base):
    24     __tablename__ = 'taobao_user'
    25     id = Column(Integer, nullable=False, primary_key=True, autoincrement=True)
    26     name = Column(String(32), nullable=False, server_default='X')
    27     home_addr_id = Column(Integer, ForeignKey('taobao_addr.id'), nullable=False)
    28     work_addr_id = Column(Integer, ForeignKey('taobao_addr.id'), nullable=False)
    29 
    30     # home_addr = relationship('Taobao_addr')
    31     # work_addr = relationship('Taobao_addr')
    32     home_addr = relationship('Taobao_addr', foreign_keys=home_addr_id)
    33     work_addr = relationship('Taobao_addr', foreign_keys=work_addr_id)
    34 
    35     def __repr__(self):
    36         return "<id:%d name:%s home_addr_id:%d work_addr_id:%d>" 
    37                %(self.id, self.name, self.home_addr_id, self.work_addr_id)
    38 
    39 Base.metadata.create_all(engine)
    40 
    41 
    42 '''
    43 --------------------------------------------------------------------------------------
    44                                    华丽分隔线
    45 --------------------------------------------------------------------------------------
    46 '''
    47 
    48 Session_class = sessionmaker(bind=engine)
    49 session = Session_class()
    50 
    51 # 插入数据
    52 '''
    53 addr_list = ['ShenZhen', 'GuangZhou', 'BeiJing', 'ShangHai']
    54 ins_addr_list = []
    55 for i in addr_list:
    56     obj = Taobao_addr(addr=i)
    57     ins_addr_list.append(obj)
    58 session.add_all(ins_addr_list)
    59 
    60 ins_user = Taobao_user(name='dudu', home_addr_id=1, work_addr_id=4)
    61 ins_user2 = Taobao_user(name='junry', home_addr_id=3, work_addr_id=3)
    62 ins_user3 = Taobao_user(name='hongfa', home_addr_id=4, work_addr_id=2)
    63 session.add_all([ins_user, ins_user2, ins_user3])
    64 
    65 session.commit()
    66 '''
    67 
    68 # 查询数据
    69 sel_user = session.query(Taobao_user).all()
    70 print(sel_user)
    71 print(sel_user[0].home_addr)
    72 print(sel_user[0].id, sel_user[0].name,
    73       sel_user[0].home_addr.addr,
    74       sel_user[0].work_addr.addr)
    sqlalchemy_manyforeignkey
  • 相关阅读:
    【BZOJ1001】狼抓兔子(网络流)
    【BZOJ4554】游戏(二分图匹配,网络流)
    【BZOJ3993】星际战争(网络流,二分答案)
    【BZOJ3140】消毒(二分图匹配)
    【Luogu1393】动态逆序对(CDQ分治)
    【BZOJ3295】动态逆序对(线段树,树状数组)
    【BZOJ1305】跳舞(网络流)
    【BZOJ1934】善意的投票(网络流)
    【BZOJ3932】任务查询系统(主席树)
    【BZOJ3123】森林(主席树,启发式合并)
  • 原文地址:https://www.cnblogs.com/Caiyundo/p/9579258.html
Copyright © 2020-2023  润新知