sqlalchemy 常用语法

使用代码实现以下SQL语句创建表结构并插入数据:

CREATE TABLE user (
    id INTEGER NOT NULL AUTO_INCREMENT,
    name VARCHAR(32),
    password VARCHAR(64),
    PRIMARY KEY (id)
);
INSERT INTO user(name, password) VALUES('fone', 'zff933');
INSERT INTO user(name, password) VALUES('alex', 'alex3714');

代码范例:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, INTEGER, String
from sqlalchemy.orm import sessionmaker

engine = create_engine("mysql+pymysql://root:111111@localhost/t1", encoding='utf-8', echo=True)     # echo=True表示输出详细执行过程
Base = declarative_base()   # 生成orm基类


class User(Base):
    __tablename__ = 'user'   # 表名
    id = Column(INTEGER, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))


Base.metadata.create_all(engine)   # 创建表结构
Session_class = sessionmaker(bind=engine)   # 创建与数据库的会话session class,即这里返回的是一个class,不是实例
Session = Session_class()   # 生成session实例

user_obj = User(name='fone', password='zff933')   # 生成要创建的数据对象,插入INSERT
user_obj2 = User(name='alex', password='alex3714')   # 生成要创建的数据对象
# 此时还没创建对象,表user仍为空

Session.add(user_obj)   # 把要创建的数据对象添加到这个session,稍后统一创建
Session.add(user_obj2)   # 把要创建的数据对象添加到这个session,稍后统一创建
# 此时还没创建对象,表user仍为空

Session.commit()   # 统一提交,此时才会创建数据

# 查询 select
Session.query(User).filter(查询条件).first()    # 返回查询到的第一条数据
Session.query(User).filter(查询条件).all()      # 返回查询到的所有数据
例如(接上例代码):

select_data = Session.query(User).filter(User.id > 3).all()

注意,这里返回的select_data是一个内存对象,需要调用才能显示数据:

print(select_data[0].id, select_data[0].name, select_data[0].password)

若只取第一条数据则不用指定列表索引。
如果想要直接返回数据,可以在User类中添加返回函数:

def __repr__(self):
    return '[%s] %s: %s' % (self.id, self.name, self.password)

多条件查询:接多个.filter(条件)即可

select_data = Session.query(User).filter(User.id > 3).filter(User.id < 6).all()

filter()中可以使用的比较符有:==、!=、.like('%ed')
% 用于匹配任意字符

# 修改 update
采用直接赋值的方式,如(User类中没有添加返回函数):

select_data[0].name = 'Fone Z'
# Session.rollback()
Session.commit() # 没有commit就无法成功修改数据

关于回滚 rollback:
如果在commit之前执行rollback,则无法修改数据(如上述注释部分)。同理,若add之后commit之前执行了rollback,则同样无法插入数据,但此时的最新自增ID会加1(截图演示),即这里的机制是先插入数据,但遇到rollback又删除了。(如下例)

my_user = Session.query(User).filter_by(id=5).first()
my_user.name = "Jack"

fake_user = User(name='Rain', password='12345')
Session.add(fake_user)

print(Session.query(User).filter(User.name.in_(['Jack', 'rain'])).all()) # 这时看session里有刚添加和修改的数据

Session.rollback() # rollback清除了修改的内容
Session.commit()

# 删除 delete

Session.delete(my_user)
Session.commit()

# 分组 group by 并统计

from sqlalchemy import func
print(Session.query(func.count(User.name), User.name).group_by(User.name).all())

打印结果:

[(1, 'alex'), (1, 'Fone Z'), (1, 'Rain')]

相当于原生SQL:

SELECT count(user.name) AS count_1, user.name AS user_name FROM user GROUP BY user.name;

转载于:https://www.cnblogs.com/fone933/p/8331312.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值