gpt4 book ai didi

sql - SQLAlchemy 中的多对多查询非常慢

转载 作者:行者123 更新时间:2023-12-05 03:05:18 25 4
gpt4 key购买 nike

我有这个数据库,其中包含 3 个表、饼图、人员以及两者之间的连接点。一个馅饼可以做很多人,一个人可以做很多馅饼,所以这是一个非常合法的用例。

我要输出的是一个巨大的表格,格式如下:

+-------------------------------------------------------
| person_id | person_name | pies
+-------------------------------------------------------
| 1 | john | apple, banana, plum, ..
| 2 | mary | apple, plum, pineapple, ..
| ... | ... | ..., ..., ..., ...
| 10000 | josh | banana, coconut, ...

我目前的实现如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import random
import time

app = Flask(__name__)
db = SQLAlchemy(app)

person_to_pie_association_table = db.Table(
'person_to_pie_association_table',
db.metadata,
db.Column('pie_id', db.Integer, db.ForeignKey('pie.id')),
db.Column('person_id', db.Integer, db.ForeignKey('person.id'))
)

class Person(db.Model):
__tablename__ = 'person'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
age = db.Column(db.Integer)
pies = db.relationship("Pie", secondary=person_to_pie_association_table, backref="pies")


class Pie(db.Model):
__tablename__ = 'pie'
id = db.Column(db.Integer, primary_key=True)
flavour = db.Column(db.String)
user_id = db.Column(db.Integer)

db.create_all()

for i in range(1, 10000):
name = random.choice(['mary', 'mr F', 'harry', 'cathy', 'john']) + str(i)
person = Person(name=name)
flavour = random.choice(['banana', 'strawberry', 'apple', 'chocolate']) + str(i)
pie = Pie(flavour=flavour)
db.session.add(person)
db.session.add(pie)
db.session.commit()

pielist = Pie.query.all()

for i in range(1, 10000):
print(i)
person = Person.query.get(i)
person.pies = random.sample(pielist, 5)
db.session.add(person)
db.session.commit()

persons = Person.query.all()
start = time.time()
for person in persons:
person.name
middle = time.time()
for person in persons:
person.pieflavours = ', '.join([pie.flavour for pie in person.pies])
end = time.time()
print(middle - start) # 0.005s
print(end - middle) # 38s

但是,它很慢。我认为这是因为 person.pies 仅在被引用后执行,并且执行 SQL 查询,总共进行了 10.000 次查询。我一直在浏览 SQLAlchemy 文档和其他 SO 问题,但找不到关于如何处理这个问题的满意答案。

因此,与其在旅途中加入,不如事先加入。我也尝试像这样制定查询:Person.query.join(Pie, Person.pies),但结果相同。

感谢任何建议!

最佳答案

事实证明我看起来还不够好,将关系的 lazy 参数设置为 'joined' 使其速度提高了 1000 倍(字面意思)。

    pies = db.relationship("Pie", secondary=person_to_pie_association_table, backref="pies", lazy='joined')

关于sql - SQLAlchemy 中的多对多查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51127643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com