Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlalchemy 为什么我的两个SQL迭代不同?_Sqlalchemy_Iteration - Fatal编程技术网

Sqlalchemy 为什么我的两个SQL迭代不同?

Sqlalchemy 为什么我的两个SQL迭代不同?,sqlalchemy,iteration,Sqlalchemy,Iteration,我在python中有以下SQLAlchemy迭代: for business in session.query(Business).filter(Business.name.like("%" + term + "%")): print business.name 我的列表中大约有7000家企业,时间不到10毫秒。太好了 然而,我想支持比like更具体的搜索算法——例如,我想匹配&with和,等等。因此,我尝试了以下方法: for business in session.query(

我在python中有以下SQLAlchemy迭代:

for business in session.query(Business).filter(Business.name.like("%" + term + "%")):
    print business.name  
我的列表中大约有7000家企业,时间不到10毫秒。太好了
然而,我想支持比like更具体的搜索算法——例如,我想匹配&with和,等等。因此,我尝试了以下方法:

for business in session.query(Business):
    if term in business.name:
        print business.name
后者的运行时间约为600毫秒。SQLAlchemy在其过滤器调用中做了什么,使得迭代速度更快?我怎样才能让我的更快


谢谢

SA不会优化您的查询。
您的区别在于:

  • 一方面直接过滤RDBMS上的数据,另一方面
  • 将数据库中的所有行加载到内存中,然后过滤掉不需要的行 显然,第二个版本会慢得多,特别是当行数很大时。事实上,SA甚至可能导致第二个版本的速度变慢,因为它为数据库中的每一行创建
    业务
    对象,这取决于您的模型,可能是相对昂贵的操作。此外,如果您有急切的加载关系,它也会加载这些关系。只需直接对数据库运行以下两个查询,查看每个查询返回的行数:

    SELECT * FROM Business WHERE Name LIKE '%term%';
    SELECT * FROM Business;
    

    我建议对大量对象使用SQL引擎过滤功能,因为您可以更高效地直接进行大部分过滤

    谢谢!你能推荐这样的过滤功能吗?我正在使用SQLite,但MySQL也是一个option@Raiders. 我指的不是任何特殊的过滤功能,而是
    WHERE
    语句。真正的区别在于,在这种情况下,您只从数据库中加载一些数据行并为它们创建Python对象,而在当前设置中,您从表中加载所有行,为它们装入Python对象,然后丢弃一些;除了花费更多的时间外,这些物体仍然留在记忆中。