#python #sqlalchemy
#programowanie

Mam aplikację we flasku gdzie przerzucam dane z jednej bazy danych do drugiej. Niektóre zapytania zajmują 2 sekundy a niektóre nawet i 2 minuty (z tym akurat walczę i staram się zoptymalizować). Po 60 sekundach zawsze dostaje 504 time out z ngnixa. Niestety zauważyłem że podczas testowania endpointów (ponad 50) dostaje coraz częściej błąd:
TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30

Co
via Wykop Mobilny (Android)
  • 1
@PiotrokeJ: wyrzuc te taski do jakiegos workera. Moze byc celery, ale jest troche prostszych rozwiazan. Na pewno wykonywanie takich ciezkich rzeczy w watku web servera jest slabym pomyslem.
  • Odpowiedz
Mam pewną zagwozdkę z filtrowaniem danych które pobieram z bazy za pomocą sqlalchemy. Mam zbudowany model tabeli, jestem w stanie wyciągnąć dane z bazy. Jednak problem pojawia się wtedy kiedy dla niektórych tabel musze pobrać dane z jakaś flagą np. TRACKFLAG = "X".

Niestety każda tabela ma inny filtr. Normalnie bym wykonał query lambda.

queryfilter = lambda query: query.where(NAZWATABELI.NAZWAKOLUMNY == 'X')

Jako że mam kilka/kilkanaście różnych warunków dla róznych tabel chce
Muszę przerobić troche projekt oparty na flasku i sqlalchemy. Mamy endpoint gdzie wsadem jest nazwa klasy(tabeli) która ma zostać wywołana. Jednak z tej klasy muszę pobrać zmieną _tablename bo to jest moja domyśla nazwa tabeli. Żeby to zrobić muszę wywołać plik gdzie trzymam te klasy(tablemodels) i podać nazwę klasy(Loc) - tablemodels.Loc.tablename_ <- takie coś zwraca mi to o co mi chodzi. Teraz pytanie jak zrobić żeby Loc
@PiotrokeJ:
Zawsze można evalem zrobić, ale może znajdziesz jakieś lepsze rozwiązanie.

class Abc:
value = 123

class Xyz:
value = 456

def getvaluefromclass(classname):
return eval(f"{classname}.value")

print(get
valuefromclass("Abc"))
print(getvaluefromclass("Xyz"))

output:
python test.py
123
456

albo name samo Eval(nazwa
klasy) zwróci klasę i możesz robić z tym co chcesz
  • Odpowiedz
Robię sobie proste filtrowanie gier w tabeli. Na stronie mam trzy pola: minrating, maxrating i genre (+ przycisk "submit"). Jeżeli wypełnię wszystkie 3, to filtrowanie działa i url wygląda np. tak:

[http://127.0.0.1:5000/test?rating_min=25&rating_max=60&genre=RPG](http://127.0.0.1:5000/test?rating_min=25&rating_max=60&genre=RPG)
Natomiast jeżeli ominę chociaż jedno pole (np. minrating), to wtedy nie wyszukuje mi się nic, mimo, że pozostałe kryteria mają swoje wartości:

[http://127.0.0.1:5000/test?rating_min=&rating_max=60&genre=RPG](http://127.0.0.1:5000/test?rating_min=&rating_max=60&genre=RPG)
Ma ktoś pomysł jak to naprawić? Tzn. żeby w przypadku braku wartości w jakimś
Rajtuz - Robię sobie proste filtrowanie gier w tabeli. Na stronie mam trzy pola: minr...

źródło: comment_1652977721XkewtbClsIb0naqeCmsFk7.jpg

Pobierz
@Rajtuz: spoks

PS. sorry za tych trochę nerwów, bardzo nie lubię gdy ktoś odpowiada że nawet nie wypróbuje sugestii z wątku, a początkowo tak właśnie odebrałem Twoją wypowiedź. Powodzenia z projektem!
  • Odpowiedz
No hej.

Mam pewien problem z combem Flask + SQLAlchemy +Postgres.

Mam sobie modele zdefiniowane w SQLAlchemy:

post_tags = Table('post_tags', Base.metadata,
Column('post_id', Integer, ForeignKey('post.id')),
Column('tag_nametag', Text, ForeignKey('tag.nametag'))
)

class Post(Base):
__tablename__ = 'post'
id = Column(Integer, primary_key = True, autoincrement='auto')
author_id = Column(Integer, ForeignKey('user.id'),nullable=False)
created = Column(DateTime, nullable = False, default = datetime.now().date())
score = Column(Integer, nullable = False, default = 0)
title = Column(Text, nullable = False, unique = True)
body
Mirki z #python - jak komunikować się z bazą danych w kilku wątkach, używając sqlachemy?
Mam obiekt klasy A odpowiadający rekordom w tabeli a, z relacją one-to-many do rekordów z tabeli b (obiekt klasy B). W głównym wątku aplikacji dokonuję operacji na obiekcie A, a w oddzielnym wątku (threading.Thread) tworzę nowe obiekty B, podając im jako argument obiekt A z głównego wątku (żeby zachować odpowiednią relację).
Siema mirki z Python, jaki jest preferowany/właściwy sposób budowania dziedzina dla klas ze sqlalchemy po klasach spoza tej biblioteki?
Chciałbym, aby klasa będąca modelem ORM ze sqlalchemy (powiedzmy User), dziedziczyła po klasie nie będącej takim modelem, powiedzmy Innaklasa z jakiegoś innego modułu. Zamysł jest taki, że metody z Innaklasa operują na danych które wyciągam z SQL używając klasy User. To pozwala na używanie klasy Innaklasa niezależnie od bazy danych.

Problem
@grajlord: Ok, już wiem. Obiekty przy kwerendzie są inicjowane z pominięciem __init__. Trzeba dodać metodę z dekoratorem @sqlalchemy.orm.reconstructor, a w niej np. wywołać self.__init__() na jakichś własnych argumentach.
  • Odpowiedz