ORM的两种创建方式
数据库优先:指的是先创建数据库,包括表和字段的建立,然后根据数据库生成ORM的代码,它是先创建数据库,再创建相关程序代码
代码优先:就是先写代码,然后根据代码去生成数据库结构。
代码优先创建数据库的本质:拿到类-->转换成table对象, 然后根据table对象生成sql语句--> 生成数据库表结构
另外两个知识点:
- 改变数据输出的方式:可以在表的类中定义一个特殊成员:__repr__,return一个自定义的由字符串拼接的数据连接方式.
- 数据库中表关系之间除了MySQL中标准的外键(ForeignKey)之外,还可以创建一个虚拟的关系,比如
group = relationship("Group",backref='uuu'),一般此虚拟关系与foreignkey一起使用.
SQLalchemy联表操作
1.一对多关系
需求:
- 用户组,有dba,ddd组
- 用户,用户只能属于一个用户组
两个表如下:
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:123@192.168.29.128: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()