python_way day13 sqlalchemy

sqlalchemy

一对多

多对多



1、一对多

一、#创建表结构
class Host(Base):  #所有的子类都继承这个基类
    #创建表结构
    __tablename__ = ‘hosts‘
    id = Column(Integer, primary_key=True,autoincrement=True)
    hostname = Column(String(64),unique=True,nullable=False)
    group_id = Column(Integer,ForeignKey(‘groups.id‘))   #创建外面hosts中的group_id关联到work_group的id
    group = relationship("Group")   #要写大写的实例名字通过映射的关系 , 能在hosts表中查询到外键表中的其他value    def __repr__(self):
        return "<id = %s,jump_user_name=%s>" % (self.id, self.username)
 class Group(Base): __tablename__= ‘groups‘     id = Column(Integer,primary_key=True) #自动自增,主键      name = Column(String(64),unique=True,nullable=False)

 Base.metadata.create_all(engine) #执行上面的sql  图示: group  键 1 web       2 db host hostname   

                  外键group_id       1   nginx        1       2   mysql       2

这时候我们把host的group_id 和 group.id 做了外键关联意思就是说我必须有group组,在能创建host组,或者说我们也可以先把host的这是为可以为空,这样就可以先填写host这涨表了

二、#插入数据
第一种插入数据的方法1、我们可以直接插入host主机h1 = Host(hostname = "nginx")h2 = Host(hostname = "mysql")
session.add_all([h1,h2])session.commit()
2、然后我们再插入group数据

g1 = Group(name = ‘web‘)g2 = Group(name = ‘db‘)

session.add_all([g1,g2])session.commit()
3、再做host和group关联(就是把host的group_id 改下)
g1 = session.query(Group).filter(Group.name == "web").first()      #找出g1的对象h1 = session.query(Host).filter(Host.hostname==‘nginx‘).update({"group_id":g1.id}) session.commit()

#插入数据时也可以以主动指定外键的值,但是不要超过被关联的键的范围就可以
h1 = Host(hostname = "nginx",group_id = 1)h2 = Host(hostname = "mysql",group_id = 2)
h3 = Host(hostname = "origer",group_id = 3)  这样就报错了


第二种插入数据的方法先把group表值插进去,然后再插入host表
SessionCls = sessionmaker(bind=engine)session = SessionCls()

g1 = Group(name = ‘web‘)    #先插入group表g2 = Group(name = ‘db‘)session.add_all([g1,g2])     #gw = session.query(Group).filter(Group.name == ‘web‘).first()     #不用提交g1就可以在内存中查询到group中对应的数据,gb = session.query(Group).filter(Group.name == ‘db‘).first()h1 = Host(hostname = "nginx",group_id = gw.id)            #直接复制给h1使用h2 = Host(hostname = "mysql",group_id = gb.id)session.add_all([h1,h2])session.commit()
三、查询

1、all 和 first
all()gw = session.query(Group).all()print(gw)[<__main__.Group object at 0x0000003438C3F0F0>, <__main__.Group object at 0x0000003438C3F160>]  #拿到了跟Group有关的所有数据,是个列表
print(gw[0].name)   dbprint(gw[0].id)2
first()gw = session.query(Group).first()
print(gw)<__main__.Group object at 0x000000C703531208>    #这个就是获取匹配到的第一个对象
print(gw.name)dbprint(gw.id)2

2、query()
query中是要查的表,里面放的是表的类名,这里也是有2中情况

query(class)
gw = session.query(Group).all()print(gw)[<__main__.Group object at 0x000000446E0C1080>, <__main__.Group object at 0x000000446E0C10F0>]  #这样知道的是所有的类对象,是个列表

query(class.args)
gw = session.query(Group.name).all()print(gw)[(‘db‘,), (‘web‘,)]

3、连表查询
SessionCls = sessionmaker(bind=engine)session = SessionCls()

a、join :   inner  joingw = session.query(Group).join(Host).all()print(gw)[<__main__.Group object at 0x0000002B1B345860>]
 
b、isouter=True : lelf join 
gw = session.query(Host).join(Group,isouter=True).all()print(gw)[hostanme : nginx  -  group_id = 1, hostanme : mysql  -  group_id = 1]

+----+----------+----------+------+------+
| id | hostname | group_id | id | name   |
+----+----------+----------+------+------+
| 1 | nginx    | 1     | 1   | web  |
| 2 | mysql    | 1     | 1   | web  |
+----+----------+----------+------+------+

上图发现,我们获取到的只是host表里的内容,并没有group中的内容

c、我如果我们想要把host表中和gorup中的内容都获取到

gw = session.query(Host,Group).join(Group,isouter=True).all()print(gw)[(hostanme : nginx  -  group_id = 1, <__main__.Group object at 0x000000B3C53140B8>), (hostanme : mysql  -  group_id = 1, <__main__.Group object at 0x000000B3C53140B8>)]

d、我们想要拿到准确的内容,不要对象怎么做?
gw = session.query(Host.hostname,Group.name).join(Group,isouter=True).all()print(gw)[(‘nginx‘, ‘web‘), (‘mysql‘, ‘web‘)]

自定义查询返回值:

class JumpUser(Base):
    __tablename__ = ‘jump_user‘
    id = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(Integer,unique=True,nullable=False)
    passwd = Column(Integer,nullable=False)
    groups = relationship("Group",secondary=lambda : JumpUser_2_Group.__table__,backref=‘jumpuser_list‘)
    host_list = relationship("HostUser", secondary=lambda: JumpUser_2_HostUser.__table__, backref=‘jumpuser_list‘)
    def __repr__(self):
        return "<id = %s,jump_user_name=%s>" % (self.id, self.username)

repr中我们使用什么做返回值,在查询时就返回什么

  

时间: 2024-10-13 12:18:44

python_way day13 sqlalchemy的相关文章

day13 SQLAlchemy

ORM:也叫关系对象映射 本篇要点: 原生模块 pymsql ORM框架 SQLAchemy pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 需要准备的环境: MySQL(服务端) pymysql(操作客户端) pymysql安装参考:http://www.cnblogs.com/woider/p/5926744.html pymysql的使用操作: 执行SQL语句: SQLAchemy SQLAlchemy本身无法操作数据库,其必须以来p

Day13 SQLAlchemy连表操作和堡垒机

1.创建表.插入数据和一对多查询 #!/usr/bin/env python # -*- coding: utf-8 -*- # Author: wanghuafeng from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm impor

Python学习-day13 SqlAlchemy

本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM介绍 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,

python_way day13 paramiko

paramiko 一.安装 pip3 install paramiko 二.使用 1.SSHClient 用于连接远程服务器并执行基本命令 import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='c1.salt.com',

python运维开发(十三)----SQLalchemy和paramiko续

内容目录: ORM架构SQLalchemy Paramiko SQLalchemy对表的操作 使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作.根据类创建对象,对象转换成SQL,执行SQL. 1.创建表 # 单表 class Test(Base): __tablename__ = 'test' nid = Column(Integer, primary_key=True,

Part01、sqlalchemy 使用

一.ORM 连表 一对多 1.创建表,主动指定外键约束. 2.操作. 类:repr            一对多:                           单表 连表 session.query(表1).join(表2).all( )                      多对多: 1.创建表,额外的关系表. 2.filter( )  _in( )  把结果可传进去. 3.relationship A A_B ==> [关系表] relationship 字段 和 primary

sqlalchemy备忘 笔记

查询全部记录,返回列表 user = self.dbSession.query(User).all()  #返回列表,全部结果封装在列表中 user = self.dbSession.query(User.username, User.createtime).all()  #返回指定字段,每条记录封装在元组中 user = self.dbSession.query(House).all()      #在添加到add后没有commit前的数据都可以查出来 user = self.dbSessio

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc

SQLAlchemy使用笔记--SQLAlchemy ORM(二)

参考: http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#building-a-relationship http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#working-with-related-objects 建立表之间带关系 建立外建 在address添加user的外键 from sqlalchemy import ForeignKey, Column, String