[PYTHON] Beschleunigen Sie die Abfragegenerierung mit SQLAlchemy ORM

Angenommen, Sie haben eine Tabelle wie diese:

import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base

base = declarative_base()

class Xyz(base):
    __tablename__ = 'xyz'
    id = sa.Column(sa.INTEGER, primary_key=True)
    c1 = sa.Column(sa.INTEGER)
    c2 = sa.Column(sa.INTEGER)
    c3 = sa.Column(sa.INTEGER)
    c4 = sa.Column(sa.INTEGER)
    c5 = sa.Column(sa.INTEGER)
    c6 = sa.Column(sa.INTEGER)
    c7 = sa.Column(sa.INTEGER)
    c8 = sa.Column(sa.INTEGER)
    c9 = sa.Column(sa.INTEGER)

	@classmethod
	def from_c3(cls, n):
		return session.query(cls).filter_by(c3=n).one()

Wenn dieses from_c3 () lange dauert, kann die Zeit, die das ORM zum Generieren des SQL benötigt, wie folgt überprüft werden:

from sqlalchemy.orm import Query
from timeit import timeit

f1 = lambda: str(Query(Xyz).filter_by(c3=123))
print f1()
print timeit(f1, number=10000)

'''Ergebnis
SELECT xyz.id AS xyz_id, xyz.c1 AS xyz_c1, xyz.c2 AS xyz_c2, xyz.c3 AS xyz_c3, xyz.c4 AS xyz_c4, xyz.c5 AS xyz_c5, xyz.c6 AS xyz_c6, xyz.c7 AS xyz_c7, xyz.c8 AS xyz_c8, xyz.c9 AS xyz_c9 
FROM xyz 
WHERE xyz.c3 = :c3_1
4.91327404976
'''

Wenn dies lange dauert, können Sie die Abfrage beschleunigen, indem Sie das generierte SQL zwischenspeichern.

compiled = str(Query(Xyz).filter_by(c3=sa.bindparam('c3')))
f2 = lambda: str(Query(Xyz).from_statement(compiled).params(c3=123))
print f2()
print timeit(f2, number=10000)

'''Ergebnis
SELECT xyz.id AS xyz_id, xyz.c1 AS xyz_c1, xyz.c2 AS xyz_c2, xyz.c3 AS xyz_c3, xyz.c4 AS xyz_c4, xyz.c5 AS xyz_c5, xyz.c6 AS xyz_c6, xyz.c7 AS xyz_c7, xyz.c8 AS xyz_c8, xyz.c9 AS xyz_c9 
FROM xyz 
WHERE xyz.c3 = :c3
1.09750509262
'''

Diese SQL-Generierungszeit hängt von der Komplexität des Schemas ab, sodass Sie mehr Zeit für Tabellen mit mehr Spalten sparen können.

Nachtrag

Filter ('c3 =: c3') ist einfacher als filter_by (c3 = sa.bindparam ('c3').

Recommended Posts

Beschleunigen Sie die Abfragegenerierung mit SQLAlchemy ORM
Verwenden Sie Enum mit SQLAlchemy
Holen Sie sich die Tabelle dynamisch mit sqlalchemy
Künstliche Datengenerierung mit Numpy
Verwenden Sie DATE_FORMAT mit dem SQLAlchemy-Filter
Satzerzeugung mit GRU (Keras)
Einführung in RDB mit sqlalchemy Ⅰ
Wie aktualisiere ich mit SQLAlchemy?
Kombinieren Sie Fast API mit Django ORM
Wie mit SQLAlchemy ändern?
Bildunterschriftengenerierung mit Chainer
Group_by mit sqlalchemy und sum
Unterstützt mehrere Sitzungen mit SQL Alchemy
Wie lösche ich mit SQLAlchemy?