sqlalchemy限制查询

SQLAlchemy介绍

     SQLAlchemy 的一个目标是提供能兼容众多数据库(如 SQLite、MySQL、Postgres、Oracle、MS-SQL、SQLServer 和 Firebird)的企业级持久性模型。

    目前正处于积极开发阶段,已建立了丰富的社区。针对 SQLAlchemy 的扩展和插件包括:declarative、Migrate、Elixir、SQLSoup、django-sqlalchemy、DBSprockets、FormAlchemy 和 z3c.sqlalchemy

     该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

结构如下

Engine,框架的引擎
Connection Pooling ,数据库连接池
Dialect,选择连接数据库的DB API种类
Schema/Types,架构和类型
SQL Exprression Language,SQL表达式语言

数据库AP配置参考: 

简单增删改查

import uuid
import datetime
import sqlalchemy
import sqlalchemy.orm as orm
from sqlalchemy.ext.declarative import declarative_base
 
Base = declarative_base()
 
class TDog(Base):
    __tablename__ = "dog"
 
    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True, autoincrement=True)
    name = sqlalchemy.Column(sqlalchemy.String(256), nullable=True)
    uuid = sqlalchemy.Column(sqlalchemy.String(64), unique=True)
    addtime = sqlalchemy.Column(sqlalchemy.DateTime())
    data = sqlalchemy.Column(sqlalchemy.Text(), default='{}')
 
    def __init__(self, name, uuid, data='{}', addtime=None):
        self.name = name
        self.uuid = uuid
        self.data = data
        self.addtime = addtime if None != addtime else datetime.datetime.now()
 
 
url = 'postgresql://dbuser:dbpassword@127.0.0.1:5432/zoodb'
engine = sqlalchemy.create_engine(url)
metadata = sqlalchemy.schema.MetaData(bind=engine)
Base.metadata.create_all(engine) # 创建表结构
 
Session = orm.sessionmaker(bind=engine)
 
 
def admq():
    sess = Session()
 
    # 增加一只狗
    uuidstr = str(uuid.uuid4())
    adog = TDog("doge", uuidstr)
    sess.add(adog)
    sess.commit()
 
    # 根据 uuid 字段,查询这只狗
    qdog = sess.query(TDog).filter(TDog.uuid == uuidstr).first()
    print("查询结果:", qdog.name, qdog.uuid, qdog.addtime)
 
    # 根据 uuid 字段修改这只狗
    data = {"name": "newdoge", "addtime": datetime.datetime.now()}
    sess.query(TDog).filter(TDog.uuid == uuidstr).update(data)
    sess.commit()
    # 查询一下修改后的结果
    qdog = sess.query(TDog).filter(TDog.uuid == uuidstr).first()
    print("修改后的查询结果:", qdog.name, qdog.uuid, qdog.addtime)
 
    # 根据 uuid 字段删除这只狗
    sess.query(TDog).filter(TDog.uuid == uuidstr).delete()
    sess.commit()
    # 查询一下修改后的结果
    qdog = sess.query(TDog).filter(TDog.uuid == uuidstr).first()
    if None == qdog:
        print("删除后:dog with uuid [{0}] is not exists".format(uuidstr))
    else:
        print("删除后:", qdog.name, qdog.uuid, qdog.addtime)
 
if "__main__" ==__name__:
    admq()

1、带条件查询

def get_session(db_url: str, debug: bool = False):
    engine = sqlalchemy.create_engine(db_url, echo=debug)
    return sessionmaker(engine)

session = get_session()

session.query(User).filter(User.username=='xx').all() 
session.query(User).filter(User.username=='xx').first()
#结果为一个时正常,多了就报错
session.query(User).filter(User.username=='xx').one()
#通过id查询
session.query(User).get(2)

2、多表关联查询

def get_session(db_url: str, debug: bool = False):
    engine = sqlalchemy.create_engine(db_url, echo=debug)
    return sessionmaker(engine)

session = get_session()

#cross join
session.query(UserDetails,User).all()  

#加上了where条件
session.query(UserDetails,User).filter(User.id==UserDetails.id).all()  

 
#inner join
session.query(User.username,UserDetails.lost_login).join(UserDetails,UserDetails.id==User.id).all() 
 
#左连接,sqlalchemy没有右连接
session.query(User.username,UserDetails.lost_login).outerjoin(UserDetails,UserDetails.id==User.id).all() )  
 
#union关联
q1 = session.query(User.id)
q2 = session.query(UserDetails.id)
print(q1.union(q2).all()) 

3、原生SQL查询

sql_1 = """
    select * from `user`
"""

row = session.execute(sql_1)
print(row,dir(row))
print( row.fetchone() )
print( row.fetchmany() )
print( row.fetchall() )

4、参考

  1. SQLAlchemy进行增删改查等操作
  2. SQLAlchemy数据库查询进阶&关联查询 - 简书 (jianshu.com)
  3. SQLAlchemy_不会玩csdn的博客-CSDN博客_sqlalchemy
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

**星光*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值