文档章节

Python 学习笔记 - SQLAlchemy(下)

乐搏学院
 乐搏学院
发布于 2017/03/30 15:18
字数 1024
阅读 6
收藏 1

继续上一篇SQLAlchemy的学习之旅。

 

多对多表的创建

 

表Host和表HostUser通过表HostToHostUser关联在一起

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

from sqlalchemy import create_engine

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index,Table

from sqlalchemy.orm import sessionmaker, relationship

engine = create_engine("mysql+pymysql://yli:yli@sydnagios:3306/mydb", max_overflow=5)

Base = declarative_base()

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'))

class Host(Base): # metaclass,Host.table对象

    __tablename__ = 'host'

    nid = Column(Integer, primary_key=True,autoincrement=True)

    hostname = Column(String(32))

    port = Column(String(32))

    ip = Column(String(32))

    # host_user = relationship('HostUser', secondary=HostToHostUser, backref='h')

    host_user = relationship('HostUser', secondary=HostToHostUser.__table__, backref='h')

class HostUser(Base):

    __tablename__ = 'host_user'

    nid = Column(Integer, primary_key=True,autoincrement=True)

    username = Column(String(32))

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.1.1.1'),

    Host(hostname='c2',port='22',ip='1.1.1.2'),

    Host(hostname='c3',port='22',ip='1.1.1.3'),

    Host(hostname='c4',port='22',ip='1.1.1.4'),

    Host(hostname='c5',port='22',ip='1.1.1.5'),

])

session.commit()

session.add_all([

    HostUser(username='root'),

    HostUser(username='db'),

    HostUser(username='nb'),

    HostUser(username='sb'),

])

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=2),

    HostToHostUser(host_id=2,host_user_id=4),

    HostToHostUser(host_id=2,host_user_id=3),

])

session.commit()

 

结果如下

wKiom1gug5PTGEhPAABJRS1K_EE945.png

wKioL1gug5STfOkHAABW4OjOmTs833.png

wKiom1gug5TQ-D-sAAA-JyD-sQ8039.png

 

例1. 获取主机1的所有用户,原理和1对多的一样,通过relationship快速定位到对应的表

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

from sqlalchemy import create_engine

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index,Table

from sqlalchemy.orm import sessionmaker, relationship

engine = create_engine("mysql+pymysql://yli:yli@sydnagios:3306/mydb", max_overflow=5)

Base = declarative_base()

 

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')

     

class Host(Base): # metaclass,Host.table对象

    __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))

     

#def init_db():

#    Base.metadata.create_all(engine)

#

# def drop_db():

#     Base.metadata.drop_all(engine)

#init_db()

 

Session = sessionmaker(bind=engine)

session = Session()

 

host_obj = session.query(Host).filter(Host.hostname=='c1').first()

print(host_obj.nid)

print(host_obj.hostname)

# 第三表对应的对象(逆向查询)

print(host_obj.h)

# 循环获取的第三表对应的对象

for item in host_obj.h:

    print(item.host_user,item.host_user.nid,item.host_user.username)

    --------------

"C:\Program Files\Python3\python.exe" "C:/Users/yli/Documents/Tencent Files/38144205/FileRecv/s13课上代码/s13课上代码/s13day13课上代码/s13day13_课上代码/ORM—de,p.py"

1

c1

[<__main__.HostToHostUser object at 0x000002678C0A3CC0>, <__main__.HostToHostUser object at 0x000002678C0B53C8>, <__main__.HostToHostUser object at 0x000002678C0B5438>]

<__main__.HostUser object at 0x000002678C0B57481 root

<__main__.HostUser object at 0x000002678C0B59082 db

<__main__.HostUser object at 0x000002678C0B5AC83 nb

 

Process finished with exit code 0

 

 

例2,另外一种方式关联多表可以在group表上面

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

from sqlalchemy import create_engine

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index,Table

from sqlalchemy.orm import sessionmaker, relationship

engine = create_engine("mysql+pymysql://yli:yli@sydnagios:3306/mydb", max_overflow=5)

Base = declarative_base()

 

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')

class Host(Base): # metaclass,Host.table对象

    __tablename__ = 'host'

    nid = Column(Integer, primary_key=True,autoincrement=True)

    hostname = Column(String(32))

    port = Column(String(32))

    ip = Column(String(32))

     

    #这次是在Host表上做关联,指定通过HostToHostUser表给HostUser关联起来

    host_user = relationship('HostUser', secondary=HostToHostUser.__table__, backref='h')

class HostUser(Base):

    __tablename__ = 'host_user'

    nid = Column(Integer, primary_key=True,autoincrement=True)

    username = Column(String(32))

    # host = relationship("Host", backref='h')

    # host_user = relationship("HostUser", backref='u')

def init_db():

    Base.metadata.create_all(engine)

#

def drop_db():

    Base.metadata.drop_all(engine)

# init_db()

# # drop_db()

Session = sessionmaker(bind=engine)

session = Session()

 

 

host_obj = session.query(Host).filter(Host.hostname == 'c1').first()

print(host_obj.host_user)

for item in host_obj.host_user:

    print(item.username)

     

     

------------

[<__main__.HostUser object at 0x000001D422BCEBA8>, <__main__.HostUser object at 0x000001D422BCE550>, <__main__.HostUser object at 0x000001D422BCE630>]

root

db

nb

 

上面两张方式,个人觉得第一种更容易理解,第二种写代码更省事

 

 

登录乐搏学院官网http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

 

本文出自 “麻婆豆腐” 博客,请务必保留此出处http://beanxyz.blog.51cto.com/5570417/1874217

© 著作权归作者所有

乐搏学院
粉丝 9
博文 526
码字总数 707467
作品 0
丰台
程序员
私信 提问
[flask-SQLAlchemy]关于flask-SQLAlchemy的初级使用教程

鉴于网上关于flask-SQLAlchemy的实例使用教程参差不齐,于此写下工作学习过程中的使用过程,以便分享交流。 对于python关于flask有一定了解的高端玩家来说,请转至flask官方开发文档。 一.安...

yzy121403725
2018/05/24
0
0
SQLAlchemy学习笔记(回滚,查询) 2

这章记下SQLAlchemy的事务和查询 回滚(Roll back) ***回滚是针对未提交之前的,提交后是不能回滚的,所以一般是 事务完成后提交, 注意脏读 session.add(User("33", "33", "33"))session.rollb......

flyking
2013/11/27
33
0
Python之使用Pandas库实现MySQL数据库的读写

  本次分享将介绍如何在Python中使用Pandas库实现MySQL数据库的读写。首先我们需要了解点ORM方面的知识。 ORM技术   对象关系映射技术,即ORM(Object-Relational Mapping)技术,指的是...

jclian91
2018/04/06
0
0
SQLAlchemy 和其他的 ORM 框架

Python ORM 概览 作为一个美妙的语言,Python 除了 SQLAlchemy 外还有很多ORM库。在这篇文章里,我们将来看看几个流行的可选 ORM 库,以此更好地窥探到Python ORM 境况。通过写一段脚本来读写...

oschina
2014/05/03
21K
6
IronPython通过pypyodbc使用SQLAlchemy的方法

SQLAlchemy是目前在Python界大热的技术,但由于IronPython数据库接口库的缺乏,IronPython却一直无法使用此神器。 现在,借助于纯Python的ODBC接口库pypyodbc,通过简单扩展SQLAlchemy,Iro...

派派技术小组
2013/03/07
425
0

没有更多内容

加载失败,请刷新页面

加载更多

VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
15分钟前
1
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
24分钟前
1
0
《DNS攻击防范科普系列3》 -如何保障 DNS 操作安全

引言 前两讲我们介绍了 DNS 相关的攻击类型,以及针对 DDoS 攻击的防范措施。这些都是更底层的知识,有同学就来问能否讲讲和我们的日常操作相关的知识点,今天我们就来说说和我们日常 DNS 操...

Mr_zebra
25分钟前
1
0
zk中ServerCnxn

实现接口Stats, Watcher 内部类 DisconnectReason CloseRequestException EndOfStreamException(流关闭) 属性 方法 getSessionTimeout 获取session失效时间 sendResponse 发送回复数据 se......

writeademo
30分钟前
1
0
如何将 Redis 用于微服务通信的事件存储

来源:Redislabs 作者:Martin Forstner 翻译:Kevin (公众号:中间件小哥) 以我的经验,将某些应用拆分成更小的、松耦合的、可协同工作的独立逻辑业务服务会更易于构建和维护。这些服务(也...

中间件小哥
33分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部