一对多关系
models表创建
| import datetime |
| from sqlalchemy import create_engine |
| from sqlalchemy.orm import declarative_base, relationship |
| from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index |
| |
| Base = declarative_base() |
| |
| |
| |
| class User(Base): |
| __tablename__ = 'users' |
| |
| id = Column(Integer, primary_key=True, autoincrement=True) |
| name = Column(String(32), index=True, nullable=False) |
| email = Column(String(32), unique=True) |
| |
| ctime = Column(DateTime, default=datetime.datetime.now) |
| extra = Column(Text) |
| |
| def __str__(self): |
| return self.name |
| |
| def __repr__(self): |
| return self.name |
| |
| |
| |
| class Hobby(Base): |
| __tablename__ = 'hobby' |
| id = Column(Integer, primary_key=True) |
| caption = Column(String(50), default='篮球') |
| |
| def __str__(self): |
| return self.caption |
| |
| def __repr__(self): |
| return self.caption |
| |
| |
| class Person(Base): |
| __tablename__ = 'person' |
| id = Column(Integer, primary_key=True) |
| name = Column(String(32), index=True, nullable=True) |
| |
| |
| hobby_id = Column(Integer, ForeignKey("hobby.id")) |
| |
| |
| |
| hobby = relationship('Hobby', backref='pers') |
| |
| def __str__(self): |
| return self.name |
| |
| def __repr__(self): |
| return self.name |
操作
| from sqlalchemy import create_engine |
| from sqlalchemy.orm import sessionmaker |
| from models import Hobby, Person, User |
| |
| engine = create_engine( |
| "mysql+pymysql://root:1234@127.0.0.1:3306/sqlalchemy02", |
| max_overflow=0, |
| pool_size=5, |
| pool_timeout=30, |
| pool_recycle=-1 |
| ) |
| |
| Session = sessionmaker(bind=engine) |
| session = Session() |
| |
| |
| hobby = Hobby(caption='足球') |
| hobby1 = Hobby() |
| session.add_all([hobby, hobby1]) |
| session.commit() |
| |
| |
| p1 = Person(name='彭于晏', hobby_id=1) |
| p2 = Person(name='刘亦菲', hobby_id=2) |
| session.add_all([p1, p2]) |
| session.commit() |
| |
| |
| hobby1 = Hobby(caption='乒乓球') |
| p1 = Person(name='彭于晏', hobby=hobby1) |
| session.add(p1) |
| session.commit() |
| |
| |
| per=session.query(Person).filter_by(name='彭于晏').first() |
| print(per) |
| |
| print(per.hobby.caption) |
| |
| |
| hobby=session.query(Hobby).filter_by(caption='篮球').first() |
| print(hobby) |
| |
| print(hobby.pers) |
| print(hobby.pers[0].name) |
多对多关系
models表创建
| import datetime |
| from sqlalchemy import create_engine |
| from sqlalchemy.orm import declarative_base, relationship |
| from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index |
| |
| Base = declarative_base() |
| |
| |
| |
| class User(Base): |
| __tablename__ = 'users' |
| |
| id = Column(Integer, primary_key=True, autoincrement=True) |
| name = Column(String(32), index=True, nullable=False) |
| email = Column(String(32), unique=True) |
| |
| ctime = Column(DateTime, default=datetime.datetime.now) |
| extra = Column(Text) |
| |
| def __str__(self): |
| return self.name |
| |
| def __repr__(self): |
| return self.name |
| |
| |
| |
| class Hobby(Base): |
| __tablename__ = 'hobby' |
| id = Column(Integer, primary_key=True) |
| caption = Column(String(50), default='篮球') |
| |
| def __str__(self): |
| return self.caption |
| |
| def __repr__(self): |
| return self.caption |
| |
| |
| class Person(Base): |
| __tablename__ = 'person' |
| id = Column(Integer, primary_key=True) |
| name = Column(String(32), index=True, nullable=True) |
| |
| |
| hobby_id = Column(Integer, ForeignKey("hobby.id")) |
| |
| |
| |
| hobby = relationship('Hobby', backref='pers') |
| |
| def __str__(self): |
| return self.name |
| |
| def __repr__(self): |
| return self.name |
| |
| |
| |
| class Boy2Girl(Base): |
| __tablename__ = 'boy2girl' |
| id = Column(Integer, primary_key=True, autoincrement=True) |
| girl_id = Column(Integer, ForeignKey('girl.id')) |
| boy_id = Column(Integer, ForeignKey('boy.id')) |
| |
| |
| |
| class Girl(Base): |
| __tablename__ = 'girl' |
| id = Column(Integer, primary_key=True) |
| name = Column(String(64), unique=True, nullable=False) |
| |
| |
| class Boy(Base): |
| __tablename__ = 'boy' |
| id = Column(Integer, primary_key=True, autoincrement=True) |
| name = Column(String(64), unique=True, nullable=False) |
| |
| |
| girls = relationship('Girl', secondary='boy2girl', backref='boys') |
| |
| |
| if __name__ == '__main__': |
| |
| engine = create_engine( |
| "mysql+pymysql://root:1234@127.0.0.1:3306/sqlalchemy02", |
| max_overflow=0, |
| pool_size=5, |
| pool_timeout=30, |
| pool_recycle=-1 |
| ) |
| |
| Base.metadata.create_all(engine) |
| |
| |
| |
操作
| from sqlalchemy import create_engine |
| from sqlalchemy.orm import sessionmaker |
| from models import Hobby, Person, User, Boy, Girl, Boy2Girl |
| |
| engine = create_engine( |
| "mysql+pymysql://root:root@127.0.0.1:3306/sqlalchemy02", |
| max_overflow=0, |
| pool_size=5, |
| pool_timeout=30, |
| pool_recycle=-1 |
| ) |
| |
| Session = sessionmaker(bind=engine) |
| session = Session() |
| |
| |
| boy = Boy(name='王小刚') |
| boy2 = Boy(name='王小明') |
| boy3 = Boy(name='王小勇') |
| session.add_all([boy,boy2,boy3]) |
| session.commit() |
| |
| girl = Girl(name='张小华') |
| girl2 = Girl(name='刘小红') |
| girl3 = Girl(name='李小丽') |
| session.add_all([girl3, girl2, girl]) |
| session.commit() |
| |
| obj1=Boy2Girl(boy_id=1,girl_id=1) |
| obj2=Boy2Girl(boy_id=1,girl_id=2) |
| obj3=Boy2Girl(boy_id=1,girl_id=3) |
| session.add_all([obj2, obj3, obj1]) |
| session.commit() |
| |
| |
| |
| |
| |
| obj2=Girl(name='张亦菲') |
| obj3=Girl(name='李娜扎') |
| obj1=Boy(name='张小勇',girls=[obj2,obj3]) |
| |
| session.add(obj1) |
| session.commit() |
| |
| |
| boy=session.query(Boy).filter_by(name='张小勇').first() |
| print(boy.girls[0].name) |
| |
| |
| |
| girl=session.query(Girl).filter_by(name='张亦菲').first() |
| print(girl.boys) |
基本增删改查的使用
| from sqlalchemy.orm import sessionmaker |
| from sqlalchemy import create_engine |
| from sqlalchemy.orm import scoped_session |
| from models import User, Person, Hobby, Boy, Girl, Boy2Girl |
| from sqlalchemy.sql import text |
| |
| engine = create_engine("mysql+pymysql://root:1234@127.0.0.1:3306/sqlalchemy02", max_overflow=0, pool_size=5) |
| Session = sessionmaker(bind=engine) |
| session = scoped_session(Session) |
| |
| |
| |
| |
| |
| |
| user = session.query(User).filter_by(id=1).first() |
| session.delete(user) |
| session.commit() |
| |
| |
| |
| session.query(Boy).filter_by(id=1).update({'name':'xxx'}) |
| session.commit() |
| |
| |
| session.query(Boy).filter_by(id=4).update({Boy.name:'xxx1'}) |
| session.commit() |
| |
| |
| |
| |
| session.query(User).filter_by(id=2).update({'name':User.name+'_nb'},synchronize_session=False) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| res = session.query(User).from_statement(text("SELECT * FROM users where name=:name")).params(name='张三') |
| print(res) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!