sqlalchemy的数据库ORM操作(表之间的关系)

时间:2023-03-09 04:53:40
sqlalchemy的数据库ORM操作(表之间的关系)

首先导入一些需要的东东 ,我是在flask中写的,也可以用纯python去写。

from flask import Flask
from sqlalchemy import create_engine, Column, Integer, String,DateTime,Float,func,Text,or_,ForeignKey
from datetime import datetime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,relationship,backref

#1,一对多关系表

#表1
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False) #表2 (一对多)
class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(100), nullable=False)
content = Column(Text, nullable=False) uid = Column(Integer, ForeignKey("user.id")) author = relationship("User", backref='articles') #这个''backref''就是一个反转,效果等同于在Article模型中价格字段 articles = relationship('Article')。注意这个backref后面接的是=,不是()。 #后面就是添加两条数据,然后提交.

#2,  一对一关系表

#表1
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False) #一对一时候添加的一行代码,其中关键点在于uselist=False,这个加上后就把一对一关系
锁定了
user_extents = relationship('User_extent',uselist=False) # 用户从表(一对一)
class User_extent(Base):
__tablename__ = 'user_extent'
id = Column(Integer, primary_key=True, autoincrement=True)
country = Column(String(50)) uid = Column(Integer, ForeignKey('user.id'))
extent = relationship('User', backref='user_extents') #后面添加数据,提交

#3, 多对多关系表

先导入Table

from sqlalchemy import create_engine, Column, Integer, String,DateTime,Float,func,Text,or_,ForeignKey,Table
#纽带表
article_tag=Table(
#表名
'article_tag',
Base.metadata,
#这里就是将两个关键字合并 Column('article_id',Integer,ForeignKey('tag.id'),primary_key=True),
Column('tag_id',Integer,ForeignKey('article.id'),primary_key=True)
) #表1
class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50)) #这个relationship写在下面的表也行,就是关系换了下
tags = relationship('Tag',backref='articles',secondary=article_tag) #表2
class Tag(Base):
__tablename__ = 'tag'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(50)) #添加数据
art1 = Article(title='母猪上树了')
art2 = Article(title='你骑上母猪身上了') tag1 = Tag(name='有趣')
tag2 = Tag(name='搞笑') art1.tags.append(tag1)
art1.tags.append(tag2) session.add_all([art1,art2])
session.commit()