zoukankan      html  css  js  c++  java
  • Python

    ORM的两种创建方式

    数据库优先:指的是先创建数据库,包括表和字段的建立,然后根据数据库生成ORM的代码,它是先创建数据库,再创建相关程序代码

    代码优先:就是先写代码,然后根据代码去生成数据库结构。

    代码优先创建数据库的本质:拿到类-->转换成table对象, 然后根据table对象生成sql语句--> 生成数据库表结构

    另外两个知识点:

    • 改变数据输出的方式:可以在表的类中定义一个特殊成员:__repr__,return一个自定义的由字符串拼接的数据连接方式.
    • 数据库中表关系之间除了MySQL中标准的外键(ForeignKey)之外,还可以创建一个虚拟的关系,比如group = relationship("Group",backref='uuu'),一般此虚拟关系与foreignkey一起使用.

    SQLalchemy联表操作

    1.一对多关系

    需求:

    1. 用户组,有dba,ddd组
    2. 用户,用户只能属于一个用户组

    两个表如下:

    group表:

    user表:

    创建上述两个表:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # auth : pangguoping
    
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    
    
    engine = create_engine("mysql+pymysql://root:123@192.168.29.128:3306/s13", max_overflow=5)
    
    Base = declarative_base()
    
    #创建一对多表
    class Group(Base):
        __tablename__ = 'group'
        nid = Column(Integer,primary_key=True,autoincrement=True)
        caption = Column(String(32))
    class User(Base):
        __tablename__ = 'user'
        nid = Column(Integer,primary_key=True,autoincrement=True)
        username = Column(String(32))
        group_id = Column(Integer,ForeignKey('group.nid'))
        group = relationship("Group",backref='uuu')
        #这个方法输出什么,对象就获取什么
        def __repr__(self):
            temp = '%s - %s:%s' %(self.nid,self.username,self.group_id)
            return temp
    def init_db():
        Base.metadata.create_all(engine)
    init_db()
    View Code

    向上述两个表中添加数据

    Session = sessionmaker(bind=engine)
    session = Session()
    #向group表中添加数据
    session.add(Group(caption='dba'))
    session.add(Group(caption='sa'))
    session.commit()
    
    #向user表中添加数据
    session.add_all([
        User(username='user1',group_id=1),
        User(username='user2',group_id=1),
        User(username='user3', group_id=2),
        User(username='user4', group_id=2)
    ]
    )
    session.commit()
    View Code

    查询user表中的所有用户:

    # #以left.join查看
    ret = session.query(User).join(Group,isouter=True).all()
    print(ret)
    sql = session.query(User).join(Group,isouter=True)
    print(sql)
    View Code

    out:

    [1 - user1:1, 2 - user2:1, 3 - user3:2, 4 - user4:2]
    SELECT "user".nid AS user_nid, "user".username AS user_username, "user".group_id AS user_group_id
    FROM "user" LEFT OUTER JOIN "group" ON "group".nid = "user".group_id

    查询每个用户对应的组:

    常规查询方式:

    # #映射方式
    sql = session.query(User.username,Group.caption).join(Group,isouter=True)
    print(sql)
    ret = session.query(User.username,Group.caption).join(Group,isouter=True).all()
    print(ret)
    View Code

    out:

    SELECT "user".username AS user_username, "group".caption AS group_caption
    FROM "user" LEFT OUTER JOIN "group" ON "group".nid = "user".group_id
    [('user1', 'dba'), ('user2', 'dba'), ('user3', 'sa'), ('user4', 'sa')]

  • 相关阅读:
    latex如何输入正确的 双引号
    【leetcode】Linked List Cycle
    CodeForces 441 A. Valera and Antique Items
    JS封深入了解
    ArcGIS Engine开发之旅04---ARCGIS接口详细说明
    ArcGIS Engine开发之旅03--ArcGIS Engine中的控件
    ArcGIS Engine开发之旅02--ArcGIS Engine中的类库
    ArcGIS Engine开发之旅01---产品组成、逻辑体系结构
    ArcGIS三大文件格式解析
    1.准备工作及实例
  • 原文地址:https://www.cnblogs.com/pangguoping/p/5744619.html
Copyright © 2011-2022 走看看