9.1.3 增加数据

从这一步开始,我们将掌握如何使用SQLAlchemy对数据进行增删改查。通过学习,大家可以看到SQLAlchemy强大之处在于将原生SQL繁琐的语句转变成Pythonic风格的代码。

1. 增加一条数据

表9.1.3 需要用到的函数

python 读取数据库数据转成json python从数据库获取数据_时间设置

例9.1.3

shop = (311, "老北京涮羊肉", '11:00-21:00', [['周一', '满60减10'], ['周二', '满100减20']]),
new = ShopBasic(id=shop[0], name=shop[1])
sess.add(new)
sess.commit()

在上述代码中,先创建ShopBasic的实例,然后调用.add()方法将其加入到缓存区,最后.commit()提交更改。

2. 增加多条数据

当存在多条数据需要插入时,只需要按照插入一条数据时的方法,重复调用相应次数即可。

例9.1.4

shops = [
    (311, "老北京涮羊肉", '11:00-21:00', [['周一', '满60减10'], ['周二', '满100减20']]),
    (312, "大龙燚火锅", '10:00-22:00', [['周一', '满60减10'], ['周二', '满100减20']]),
    (313, "一尊皇牛", '00:00-24:00', [['周一', '满80减10'], ['周二', '满100减10']]),
]


for shop in shops:
    new = ShopBasic(id=shop[0], name=shop[1])
    sess.add(new)
    sess.commit()

在上述代码中,只是在每次循环中都.add()和.commit()提交修改。不过,细心的同学可能会产生疑问:这就相当于每次都要提交修改,对性能的影响会不会很大?是的。对性能的影响会很大。如果有办法能够批量插入数据,性能想必会有较大提升!所幸,我们只需要使用.add_all()就可以达到这样的目的。

表9.1.4 需要用到的函数

python 读取数据库数据转成json python从数据库获取数据_数据_02

例9.1.5

shops = [
    (311, "老北京涮羊肉", '11:00-21:00', [['周一', '满60减10'], ['周二', '满100减20']]),
    (312, "大龙燚火锅", '10:00-22:00', [['周一', '满60减10'], ['周二', '满100减20']]),
    (313, "一尊皇牛", '00:00-24:00', [['周一', '满80减10'], ['周二', '满100减10']]),
]

news = []
for shop in shops:
    new = ShopBasic(id=shop[0], name=shop[1], time=shop[2])
    news.append(new)

sess.add_all(news)
sess.commit()

在上述代码中,先把这3条数据的ShopBasic实例添加到news列表中,然后调用.add_all()插入news,最后提交即可。

9.1.4 查看数据

新增的数据是否真得插入到数据库中了呢?我们直接查找数据库中的数据即可。

表9.1.5  需要用到的函数

python 读取数据库数据转成json python从数据库获取数据_数据库_03

1. 输出所有数据

例9.1.6

shops = sess.query(ShopBasic).all()
for shop in shops:
    print(shop.id, shop.name, shop.time)

输出结果如图9.1.1所示。

python 读取数据库数据转成json python从数据库获取数据_数据_04

图9.1.1 basic表内容

注意,.all()方法是惰性加载,也就是说只有在查看其中的数据时才会真正访问数据表。.all()方法返回的是queryset,也就是一个查询结果的列表,这个列表中的每个元素都是独立的ShopBasic对象,其中存储了之前的数据,通过“.属性名”的方式就可以进行调用了。

2. 条件过滤

当然,如果只想得到符合条件的部分数据,最简单粗暴的做法是.all()+for循环+if条件判断。不过,这种方法使用起来不仅繁琐,而且会消耗大量资源(毕竟要把原生sql转换成python对象要比原生sql慢很多)。所幸,SQLAlchemy已提供.filter_by()方法用于条件判断了。

例9.1.7

shops = sess.query(ShopBasic).filter_by(name='老北京涮羊肉').all()
shops[0].__dict__

运行结果如图9.1.2。

python 读取数据库数据转成json python从数据库获取数据_数据库_05

图9.1.2 条件过滤

其中,_sa_instance_state是SQLAlchemy为每一行数据自动添加的,除此以外的字段都是真正保存的。

3. 排序

然而,有些时候,我们想让数据输出按照某个字段进行排序后再输出,这时候就要用到.order_by()方法。

例9.1.8

# 排序
shops = sess.query(ShopBasic).order_by('name').all()
for shop in shops:
    print(shop.id, shop.name, shop.time)

运行结果如图9.1.3。

python 读取数据库数据转成json python从数据库获取数据_数据_06

图9.1.3 排序

4. 过滤操作符

在很多情况下,需要用多种条件组合过滤才能达到想要的结果。这时候,光用“=”已经无法满足要求了。

表9.1.6 常见的过滤操作符

python 读取数据库数据转成json python从数据库获取数据_python取出数据库所有数据_07

9.1.5 修改数据

当店铺“老北京涮羊肉”的信息存入数据库后,才发现营业时间填错了,应该是“09:00-21:00”。这时候如果再新加一行数据就显得不合适了,直接对“老北京涮羊肉”这条数据做修改即可。

例9.1.9

shop = sess.query(ShopBasic).filter_by(name='老北京涮羊肉').first()
shop.time = "09:00-21:00"
sess.commit()

# 再重新查询一次,打印结果
shop = sess.query(ShopBasic).filter_by(name='老北京涮羊肉').first()
print(shop.name, shop.time, '\n')

运行结果如图9.1.4。

python 读取数据库数据转成json python从数据库获取数据_python取出数据库所有数据_08

图9.1.4 修改数据

可以看到,SQLAlchemy修改数据非常方便,取出要修改的ShopBasic实例,直接将修改后的值赋值给相应属性,然后.commit()修改即可。

9.1.6 删除数据

当数据缺失很严重的时候,这条数据的价值就显得不是那么大了,这时候就要把缺失严重的数据删除。这里,首先模拟一条数据缺失(把营业时间设置为None),然后把它删除。

例9.1.10

shop = sess.query(ShopBasic).filter_by(name='老北京涮羊肉').first()
shop.time = None  
sess.commit()

# 查看店家是否还存在
shop = sess.query(ShopBasic).filter_by(name='老北京涮羊肉').first()
shop.__dict__

现在在数据库中店铺“老北京涮羊肉”的营业时间设置为空。此时,由于政委要带熊大下馆子,为安全起见,不知道营业时间的馆子就不要了。那么,这条数据存在的意义就不那么大了,只能删除。

例9.1.11

sess.delete(shop)
sess.commit()

shops = sess.query(ShopBasic).all()
for shop in shops:
    print(shop.name)

运行结果如图9.1.5。

python 读取数据库数据转成json python从数据库获取数据_时间设置_09

图9.1.5

queryset中已经不包含店铺“老北京涮羊肉”的信息了,删除成功。