介绍
ORM数据库,简单理解就是把数据库的表抽象成一个个类,对数据库进行增删改查的时候可以直接通过库中的属性进行访问,即用python抽象数据库,通过sqlalchemy
自动转换成数据库sql语句执行,可以更专注于代码的实现,可以配合sqlacodegen
直接映射已有的数据库表,实际操作的时候需要借助其他库,例如DRIVER='mysql+pymysql
新建session
from sqlalchemy import create_engine
from sqlalchemy.engine.url import URL
from sqlalchemy.orm import sessionmaker
from config import settings
def create_session(config):
url = URL(
drivername=config.DRIVER,
username=config.USER,
password=config.PASSWORD,
host=config.HOST,
port=config.PORT,
database=config.DB,
)
engine = create_engine(url, echo=False)
Session = sessionmaker(bind=engine)
return Session()
def close_session(session):
session.close()
msp_session = create_session(settings.DATABASE.CONFIG.MSP)
ob_session = create_session(settings.DATABASE.CONFIG.OB)
通过session进行数据库操作
- 记得导入创建好的session
- 查询一条
res = msp_session.query(msp_Table.IftttRuleInfo).filter(msp_Table.IftttRuleInfo.id == rule_id).first()
- 查询所有
res = msp_session.query(msp_Table.IftttRuleInfo).filter(msp_Table.IftttRuleInfo.id == rule_id).all()
- 更新
res = msp_session.query(msp_Table.IftttRuleInfo).filter(msp_Table.IftttRuleInfo.id == rule_id).first() res.state = 1 session.commit() # 一定要提交,否则更新操作不生效
- join
只有内连接或者左连接, 左外连接为outerjoin
sql = (
msp_session.query(msp_Table.PushMarketSubTask)
.join(msp_Table.IftttRuleTaskRelation, msp_Table.IftttRuleTaskRelation.send_task_id == msp_Table.PushMarketSubTask.task_id)
.filter(msp_Table.IftttRuleTaskRelation.rule_id == rule_id)
) # 这一步会生成sql, 可以打印出来看sql内容或者在创建session的时候create_engine(url, echo=True)
sql.all() # 执行all()方法才会真正开始查询
- 表如何映射
参考sqlacodegen
直接映射已有的数据库表