Python SQLAlchemy之多对多

1.新建三张表host,host_user,host_to_host_user

host:


nid

hostname
1 c1
2 c2
3 c3
4 c4
5 c5

host_user:

nid username
1 root
2 db
3 nb
4 sb

host_to_host_user:

nid host_id host_user_id
1 1 1
2 1 2
3 1 3
4 2 2
5 2 4
6 2 3

第一个问题:我们需要查询c1服务器里面的用户都有哪些?

如果使用传统的方法,我们使用下面的语句来实现功能:

#取主机名为c1的服务器ID号
host_obj = session.query(Host).filter(Host.hostname == ‘c1‘).first()
#通过获取到的服务器ID号去对应的关系表中找到用户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,)]
#处理元祖
ret = zip(*host_2_host_user)
# print (list(ret)[0])
users = session.query(HostUser.username).filter(HostUser.nid.in_(list(ret)[0])).all()
print (users)执行结果:
[(‘root‘,), (‘db‘,), (‘nb‘,)]

使用新方式来实现,在建表的步骤里面我们加入了新的relationship:

#coding:utf-8
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]/beadata", max_overflow=5)

Base = declarative_base()

class Host(Base):
    __tablename__ = ‘host‘
    nid = Column(Integer,primary_key=True,autoincrement=True)
    hostname = 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_host_user‘
    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()

# session.add_all([
#     Host(hostname=‘c1‘),
#     Host(hostname=‘c2‘),
#     Host(hostname=‘c3‘),
#     Host(hostname=‘c4‘),
#     Host(hostname=‘c5‘),
# ])
#
# session.add_all([
#     HostUser(username=‘root‘),
#     HostUser(username=‘db‘),
#     HostUser(username=‘nb‘),
#     HostUser(username=‘sb‘),
# ])
#
# 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=‘2‘),
#     HostToHostUser(host_id=‘2‘,host_user_id=‘4‘),
#     HostToHostUser(host_id=‘2‘,host_user_id=‘3‘),
# ])

host_obj = session.query(Host).filter(Host.hostname == ‘c1‘).first()
print (host_obj.nid)
print (host_obj.hostname)
print (host_obj.h)执行结果:
1
c1
[<__main__.HostToHostUser object at 0x0000000003FA3208>, <__main__.HostToHostUser object at 0x0000000003FA3278>, <__main__.HostToHostUser object at 0x0000000003FA32E8>]

host_obj.h获取到三个对象,然后循环这三个对象,可以得到这三个对象中的host_to_host_user表中的host_user.nid,host_user.host_id,host_user.host_user_id:

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

执行结果:
1
c1
[<__main__.HostToHostUser object at 0x0000000003FA2208>, <__main__.HostToHostUser object at 0x0000000003FA2278>, <__main__.HostToHostUser object at 0x0000000003FA22E8>]
<__main__.HostUser object at 0x0000000003FA28D0> root
<__main__.HostUser object at 0x0000000003FA2A90> db
<__main__.HostUser object at 0x0000000003FA2C50> nb
时间: 2024-10-12 14:27:55

Python SQLAlchemy之多对多的相关文章

Python SQLAlchemy --1

本文為 Python SQLAlchemy ORM 一系列教學文: SQLAlchemy 大概是目前 Python 最完整的資料庫操作的套件了,不過最令人垢病的是它的文件真的很難閱讀,如果不搭配個實例進行學習真的很難理解. 此外,SQLAlchemy 依照架構將文件說明分為 SQLAlchemy ORM 與 SQLAlchemy Core ,如果不去細究到底有何不同,很容易讓人誤解. 基本上,如果只是基本的資料庫的表格建立.查詢.更新.刪除等,比較不需要使用表格間的關聯以及表格與 Python

python SQLAlchemy

这里我们记录几个python SQLAlchemy的使用例子: 如何对一个字段进行自增操作 user = session.query(User).with_lockmode('update').get(1)user.age += 1session.commit() 对多条数据进行删除操作: session.query(User).filter(or_(User.id == 1, User.id == 2, User.id == 3)).delete() 各种连接表,并进行多表操作: from s

Python SQLAlchemy --2

本文為 Python SQLAlchemy ORM 一系列教學文: 接下來會更深入地探討查詢的使用. 查詢的基本使用法為 session.query(Mapped Class),其後可加 .group_by(), .order_by(), .delete 等方法. 只是要注意的是 query() 接受的參數為 Mapped Class (例如先前定義的 User 類別),而不是表格名稱. 例如在 範例 2 中是以 User 做為參數,而不是以 user 這個表格名稱做為參數. 如果查詢成功就會回

Python SqlAlchemy使用方法

Python SqlAlchemy使用方法 1.初始化连接 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker engine = create_engine('mysql://[email protected]/test'echo=True) DBSession = sessionmaker(bind=engine) session = DBSession() ret=session.execu

记一个python+sqlalchemy+tornado的一个高并发下,产生重复记录的bug

场景:在用户通过支付通道支付完成返回时,发现我收到的处理数据记录中有两条同样的数据记录, 也就是同一笔钱,我数据库中记为了两条一样的记录. tornado端代码 from tornado import gen from tornado.concurrent import run_on_executor class processNetPay(BaseHandler): '''处理指定订单,指定支付请求,返回处理结果 ' 返回包含订单信息与用户信息体 ''' @tornado.web.asynch

Python SQLAlchemy基本操作和常用技巧包含大量实例,非常好python

http://www.makaidong.com/%E8%84%9A%E6%9C%AC%E4%B9%8B%E5%AE%B6/28053.shtml "Python SQLAlchemy基本操作和常用技巧包含大量实例,非常好python":关键词:python sqlalchemy 基本 操 作和 常用 技巧 包含 大量 实例 非常好 python 首先说下,由于最新的 0.8 版还是开发版本,因此我使用的是 0.79 版,api 也许会有些不同.因为我是搭配 mysql innodb

Python SQLAlchemy入门教程

本文将以Mysql举例,介绍sqlalchemy的基本用法.其中,Python版本为2.7,sqlalchemy版本为1.1.6. 一. 介绍 SQLAlchemy是Python中最有名的ORM工具. 关于ORM: 全称Object Relational Mapping(对象关系映射). 特点是操纵Python对象而不是SQL查询,也就是在代码层面考虑的是对象,而不是SQL,体现的是一种程序化思维,这样使得Python程序更加简洁易读. 具体的实现方式是将数据库表转换为Python类,其中数据列

Python—sqlalchemy

SQLAlchemy SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作. #Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作: ''' MySQL-Python mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> pymysql mysql+pymysq

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