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 import sessionmaker, relationship
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:[email protected]:3306/s13", max_overflow =5)
Base = declarative_base()

#单表
class Test(Base):
    __tablename__ = ‘test‘
    nid = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(32))

#一对多
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"))
    # 只用于查询
    #uuu代表虚拟列:[1 wang, 3 xiaoming, 4 xiaoxiao]
    #relationship与ForeignKey一般在一起
    group = relationship("Group", backref=‘uuu‘)

    #只是对print对象的时候有用
    def __repr__(self):
        #return "<nid=%s, username=%s, group_id=%s>" % (self.nid, self.username, self.group_id)
        temp = "%s - %s - %s" % (self.nid, self.username, self.group_id)
        return temp

#创建表
def init_db():
    Base.metadata.create_all(engine)

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

init_db()
#创建组
Session = sessionmaker(bind=engine)
session = Session()
session.add(Group(caption = ‘dba‘))
session.add(Group(caption = ‘dbd‘))
session.commit()

#只获取用户
ret = session.query(User).filter(User.username==‘wang‘).all()
print(ret)

ret = session.query(User).all()
obj = ret[0]
print(obj)
print(obj.nid)
print(obj.username)
print(obj.group_id)
ret = session.query(User.username).all()
print(ret)

#左连接isouter=True
#同时取两个表session.query(User, Group)
sql = session.query(User, Group).join(Group, isouter=True)
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()
#select * from user left join group on user.group_id = group.nid
print(ret)

#新方式(正向查询):relationship在这个表里并查询该表的数据
ret = session.query(User).all()
for obj in ret:
    # obj.group:obj代表user表的每一行数据
    # obj.group为group对象
    print(obj.nid, obj.username, obj.group_id, obj.group, obj.group.nid, obj.group.caption)

#列出组中的所有人
# ret = session.query(User.username, Group.caption).join(Group, isouter=True).filter(Group.caption == ‘dba‘).all()
# print(ret)
#新方式(反向查询):relationship不在这个表里并查询其他表的数据
obj = session.query(Group).filter(Group.caption == ‘dba‘).first()
print(obj.nid, obj.caption)
print(obj.uuu)

2、多对多关联

#!/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 import sessionmaker, relationship
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:[email protected]:3306/s13", max_overflow =5)
Base = declarative_base()

#多对多
class Host(Base):
    __tablename__ = ‘host‘
    nid = Column(Integer, primary_key=True, autoincrement=True)
    hostname = Column(String(32))
    port = Column(String(32))
    ip = Column(String(32))

class HostUser(Base):
    __tablename__ = ‘host_user‘
    nid = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(32))

class HostToHostUser(Base):
    __tablename__ = ‘host_to_hostuser‘
    #增加nid,方便以后删除
    nid = Column(Integer, primary_key=True, autoincrement=True)
    host_id = Column(Integer, ForeignKey(‘host.nid‘))
    host_user_id = Column(Integer, ForeignKey(‘host_user.nid‘))

#创建表
def init_db():
    Base.metadata.create_all(engine)

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

init_db()

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

#循环插入数据
session.add_all([
    Host(hostname=‘c1‘, port=‘22‘, ip=‘1.2.1.2‘),
    Host(hostname=‘c2‘, port=‘22‘, ip=‘1.2.1.3‘),
    Host(hostname=‘c3‘, port=‘22‘, ip=‘1.2.1.1‘),
    Host(hostname=‘c4‘, port=‘22‘, ip=‘1.2.1.4‘),
    Host(hostname=‘c5‘, port=‘22‘, ip=‘1.2.1.5‘),
])
session.commit()

session.add_all([
    HostUser(username=‘root‘),
    HostUser(username=‘mysql‘),
    HostUser(username=‘svn‘),
    HostUser(username=‘git‘),
    HostUser(username=‘oracle‘),
])
session.commit()

session.add_all([
    HostToHostUser(host_id=‘1‘, host_user_id=1),
    HostToHostUser(host_id=‘1‘, host_user_id=2),
    HostToHostUser(host_id=‘1‘, host_user_id=3),
    HostToHostUser(host_id=‘2‘, host_user_id=4),
    HostToHostUser(host_id=‘2‘, host_user_id=5),
    HostToHostUser(host_id=‘2‘, host_user_id=1),
    HostToHostUser(host_id=‘3‘, host_user_id=1),
    HostToHostUser(host_id=‘3‘, host_user_id=2),
    HostToHostUser(host_id=‘3‘, host_user_id=3),
    HostToHostUser(host_id=‘4‘, host_user_id=4),
    HostToHostUser(host_id=‘4‘, host_user_id=5),
    HostToHostUser(host_id=‘4‘, host_user_id=1),
    HostToHostUser(host_id=‘5‘, host_user_id=4),
    HostToHostUser(host_id=‘5‘, host_user_id=5),
    HostToHostUser(host_id=‘5‘, host_user_id=1),
])
session.commit()

#多对多操作数据

#获取主机1中的所有用户
host_obj = session.query(Host).filter(Host.hostname == ‘c1‘).first()
#host_obj.nid(找到主机id)

host_2_host_user = session.query(HostToHostUser.host_user_id).filter(HostToHostUser.host_id == host_obj.nid).all()
print(host_2_host_user)
#[(1,), (2,), (3,)]
r = zip(*host_2_host_user)
#print(list(r)[0])

#[1, 2, 3]
users = session.query(HostUser.username).filter(HostUser.nid.in_(list(r)[0])).all()
print(users)

3、多对多查询最简单方式

#!/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 import sessionmaker, relationship
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:[email protected]:3306/s13", max_overflow =5)
Base = declarative_base()

#多对多
class Host(Base):
    __tablename__ = ‘host‘
    nid = Column(Integer, primary_key=True, autoincrement=True)
    hostname = Column(String(32))
    port = Column(String(32))
    ip = Column(String(32))

class HostUser(Base):
    __tablename__ = ‘host_user‘
    nid = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(32))

class HostToHostUser(Base):
    __tablename__ = ‘host_to_hostuser‘
    #增加nid,方便以后删除
    nid = Column(Integer, primary_key=True, autoincrement=True)
    host_id = Column(Integer, ForeignKey(‘host.nid‘))
    host_user_id = Column(Integer, ForeignKey(‘host_user.nid‘))

    host = relationship("Host", backref=‘h‘)
    host_user = relationship("HostUser", backref=‘u‘)

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

#获取主机1中的所有用户
#主机
host_obj = session.query(Host).filter(Host.hostname==‘c1‘).first()
#host_to_hostuser表中的对象
#print(host_obj.h)

for item in host_obj.h:
    print(item.host_user, item.host_user.nid, item.host_user.username)

  

时间: 2024-09-29 10:30:18

Day13 SQLAlchemy连表操作和堡垒机的相关文章

sqlalchemy——多表操作

一对多:一对一 # one -- many class Students(Base): __tablename__ = "students" sid = Column(Integer, primary_key=True) name = Column(String(30)) age = Column(Integer) tid = Column(Integer, ForeignKey("teachers.tid")) # 声明字段值受到另一个表的字段值得约束,注意是&l

哗啦啦Python之路 - sqlalchemy/paramiko/堡垒机

I. SQLalchemy联表操作 1. 一对多 class Group(Base): # 一对多的表,组中可能包含多个用户 __tablename__ = 'group' nid = Column(Integer, primary_key=True, autoincrement=True) caption = Column(String(32)) class User(Base): __tablename__ = 'user' uid = Column(Integer, primary_key

Python - SQLAlchemy之连表操作

ORM的两种创建方式 数据库优先:指的是先创建数据库,包括表和字段的建立,然后根据数据库生成ORM的代码,它是先创建数据库,再创建相关程序代码 代码优先:就是先写代码,然后根据代码去生成数据库结构. 代码优先创建数据库的本质:拿到类-->转换成table对象, 然后根据table对象生成sql语句--> 生成数据库表结构 另外两个知识点: 改变数据输出的方式:可以在表的类中定义一个特殊成员:__repr__,return一个自定义的由字符串拼接的数据连接方式. 数据库中表关系之间除了MySQL

堡垒机的简单应用

堡垒机的定义: 即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系统状态.安全事件.网络活动,以便集中报警.及时处理及审计定责. 堡垒机的功能: 账号管理 设备支持统一账户管理策略,能够实现对所有服务器.网络设备.安全设备等账号进行集中管理 完成对账号整个生命周期的监控 对设备进行特殊角色设置如:审计巡检员.运维操作员.设备管理员等自定义设置,以满足审计需求 账号登陆 支持对X11.linux.unix.数

麒麟开源堡垒机银行行业设计方案

 麒麟开源堡垒机银行行业 设计方案 麒麟堡垒机系统 修订记录/Change History 日期 修订版本 描述 作者 2016-2-26 V1.0 将设计部分单独提出,修改用户表格 麒麟 目录 1 文档说明5 1.1 方案概述5 1.2 银行行业运维操作现状5 2 需求分析6 2.1 需求分析6 2.2 实施范围7 3 项目目标7 3.1 集中帐号管理7 3.2 集中身份认证和访问控制8 3.3 集中授权管理9 3.4 单点登录9 3.5 实名运维审计9 4 应用部署规划11 4.1 访问

行云管家堡垒机 导入腾讯云主机

行云管家堡垒机 导入腾讯云主机 如何实现了对多家云厂商多种云计算资源的集中管理,从成本.监控.备份.安全等多个维度提供统一运维管控? 工具/原料 行云管家堡垒机 方法/步骤 Step1:注册登录 登录行云管家,支持QQ.微信.微博.Google等第三方账号 Step2:创建团队 基于团队协同的工作模式,创建一个属于您的团队,填上团队名称与团队标识之后点击 立即创建团队. Step3:邀请团队加入 如果有团队成员,可在此添加成员邮箱进行邀请,如果没有可点击稍后再说. Step4:导入云主机 选择腾

python SQLAlchemy 堡垒机

SQLALchemy ORM db first 数据库操作类 code first 类操作数据库 1.自定义生成表 class 类(base): 列1  列2 根据类去创建表 2.使用类操作表 以后通过类和对象操作数据库 pramiko 堡垒机 ORM 连表 一对多 1.创建表,主动指定外键约束 2.操作 类:repr 单表 连表 session.query(表1).join(表2).all() 多对多 1.创建表,额外的关系表 2.filter() == int_( 都可以是另外一个查询) 3

基于SQLAlchemy实现的堡垒机

堡垒机 堡垒机是一种运维安全审计系统.主要的功能是对运维人员的运维操作进行审计和权限控制.同时堡垒机还有账号集中管理,单点登陆的功能. 堡垒机的实现我们主要采用paramiko和SQLalchemy,可以参考前面的paramiko博客. 堡垒机实现的流程 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码),堡垒机服务器创建jumpserver.py的主程序文件,修改用户家目录 ./bashrc: /usr/bin/python   jumperserverPATH/jumps

Python之路【第八篇】:堡垒机实例以及数据库操作

Python之路[第八篇]:堡垒机实例以及数据库操作 堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: + import paramiko transport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', password='123') ssh