Python - SQLAlchemy之连表操作

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:[email protected]: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()

向上述两个表中添加数据

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

查询user表中的所有用户:

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

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)

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‘)]

时间: 2024-10-12 23:42:15

Python - SQLAlchemy之连表操作的相关文章

Python之Django--ORM连表操作

一对多 class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Model): user_type = models.ForeignKey(UserType)# user_type对象中封装id,caption username = models.CharField(max_length=32) age = models.IntegerField() 增: 1.外键

Python SQLAlchemy 模块

SQLAlchemy 是用于实现 ORM(Object Relational Mapping,对象关系映射)的一个模块,即把数据库的表结构映射到对象上在 Python 中,也就是将关系型数据库表结构抽象成面向对象的 Python 类,将表操作转换成类操作,避免了复杂的 SQL 语句编写 [root@localhost ~]# pip3 install SQLAlchemy SQLAlchemy 连接数据库: #!/usr/bin/env python3 #-*- coding: utf-8 -*

python实现对excel表的读写操作(一)

Part 1. 模块介绍: 使用python实现对excel表的读写操作有两个模块,分别为: 1. 对excel表读取模块 xlrd 0.9.3  :下载地址: https://pypi.python.org/pypi/xlrd 英文释意:The package is for reading data and formatting information from Excel files. 2. 对excel表写入模块 xlwt 0.7.5 : 下载地址:https://pypi.python.

Python/MySQL表操作以及连接

Python/MySQL表操作以及连接 mysql表操作: 主键:一个表只能有一个主键.主键可以由多列组成. mysql> create table yuan(id int auto_increment,yuangongname int,bumen_id int, primary key(id,yuangongname))engine=innodb default charset=utf8; Query OK, 0 rows affected (0.43 sec) 外键 :可以进行联合外键,操作

Python与数据库[2] -> 关系对象映射/ORM -> 利用 sqlalchemy 实现关系表查询功能

利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例中用到的表主要有3张,一张personInfo个人信息表,一张account_store账号信息表,以及一张person_account_rel的个人信息与账号关系表. 示例中将会通过已知的人物年龄和id通过个人信息表查出个人姓名(仅为参考示例,请忽略怪异的查找逻辑 :) ),随后根据关系表得到的人

SQLAlchemy(2):多表操作

一对多:ForeignKey multitb_models.py import datetime from sqlalchemy import create_engine # 引入 创建引擎 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Inde

python中Excel表操作

python中关于excel表个的操作 使用 python中的xlwt和xlrd模块进行操作 # 2003之前:Excel:xls# 2003之后:Excel:xlsx# xlrd:读取的模块:xls,xlsx# xlwt:写分模块:xls# openpyxl:既能读也能写,只能操作xlsx 所以后面一般操作excel表格最好是使用openpyxl进行操作 # encoding=utf-8 import time import xlrd import xlwt import openpyxl i

python——Django(ORM连表操作)

一对多 class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Model): user_type = models.ForeignKey(UserType)# user_type对象中封装id,caption username = models.CharField(max_length=32) age = models.IntegerField() 增: 1.外键

Python数据库操作 MySQL数据库与数据表操作#学习猿地

# MySQL数据库与数据表操作 + 数据库的操作 + 数据库创建 + 数据库删除 + 数据表的操作 + 数据表的创建 + 数据表的修改 (表结构) + 数据表的删除 ### 数据库的操作 #### 1.数据库的创建 ```mysql # 链接mysql数据库后,进入mysql后可以操作数据 # 1. 创建库 create database if not exists tlxy default charset=utf8: -- 1. 数据库 tlxy 如果不存在则创建数据库,存在则不创建 --