Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update to Python 3.11, upgrade to SQLAlchemy 2.0 and Flask 2.4, refactor DB code #3446

Merged
merged 34 commits into from
Sep 15, 2023

Conversation

dezhidki
Copy link
Member

@dezhidki dezhidki commented Jul 31, 2023

Tämä PR päivittää TIMin palvelinpuolen käyttämään Python 3.11 ja uusimpia Python-kirjastoja.
PR:n merkittävin muutos on SQLAlchemy-kirjaston päivittäminen versioon 2.0, joka merkittävästi muuttaa SQL-kyselyjen syntaksia.

Olennaisimmat muutokset:

  • Otettu käyttöön Python 3.11, joka nopeuttaa Python-koodia 10-60 %

  • Kaikki tietokantakyselyt on muutettu käyttämään SQLAlchemy:n Select-rajapintaa. Esimerkiksi

    users = User.query.all()

    muuttuu eksplisiittiseksi SQL-kyselyn ajamiseksi:

    users = run_sql(select(User)).scalars().all()

    jossa select(User) vastaa siis SELECT * FROM useraccount -kyselyä. .scalars().all() ovat valinnaiset apufunktiot, jolla tietokannan tuloksesta tuotetaan lista.

  • Kaikki tietokantamallit muutettu vahvasti tyypitetyiksi käyttäen uutta Mapped-tyyppiä

    • Huom: PyCharm ei vielä osaa käsitellä nämä tyypitykset oikein, minkä takia se ilmoittaaa tyyppivirheistä. Mypy kuitenkin tunnistaa tyypitykset oikein kunnes PyCharmiin tulee sopiva tuki.
  • Päivitetty käyttämään PostgreSQL 15, mikä tuo joitain nopeutuksia tietokantahakuun

  • csplugin nyt tukee Python 3.11

  • Selkeytetty testien toimintaa, mikä on esiaste siirtymiseksi pytest-testauskirjaston käyttöön

Muutoksien myötä palvelinpuolella kaikki kirjastot voidaan päivittää. SQLAlchemy oli tähän mennessä suurin blokki, koska SQLAlchemy-Flask ja muut apukirjastot alkoivat vaatia sitä.

Testaus

Tämä PR pääsee yksikkötestit läpi, mutta kaikkia ominaisuuksia ei ole täysin testattu. On siis olennaista, että mahdollisimman moni voisi testata TIMia. Laitoin testin timdevs02:een

https://timdevs02.it.jyu.fi/

Testattavaa on kaikki mahdolliset dokummentit ja ominaisuudet.

TODOt

Vielä korjattavaa ennen mergeä:

  • Celery ei vielä käynnisty
  • Mypy-tarkistus ei mene vielä läpi
  • [ ] DynamicMapped muuttaminen WriteOnlyMapped Jätetään myöhemmpään korjaukseen
  • CI-ajot

@saviit
Copy link
Contributor

saviit commented Aug 1, 2023

Konekäännökset: TIM ei löydä konekääntäjiä.

konekääntäjät_manage

Sama editorin puolella. Tarkistin, että defaultconfigissa ja tietokannassa löytyy oikeat rivit. Tuottaakohan tuo uusi SQLAlchemyn tapa tehdä kysely oikean muotoisen listan?

@dezhidki
Copy link
Member Author

dezhidki commented Aug 1, 2023

Konekäännökset: TIM ei löydä konekääntäjiä.

konekääntäjät_manage

Sama editorin puolella. Tarkistin, että defaultconfigissa ja tietokannassa löytyy oikeat rivit. Tuottaakohan tuo uusi SQLAlchemyn tapa tehdä kysely oikean muotoisen listan?

Jes, kiitos. Nyt korjattu. Vanha SQLAlchemy käyttäytyi vähän oudosti siten, että

db.session.query(TranslationService).all()

palauttaa list[TranslationService], mutta

db.session.query(TranslationService.service_name).all()

palauttaisi list[tuple[str], mikä vaikuttaisi iterointiin.

Päivityksen myötä uusi SQLAlchemy antaa mahdollisuuden määrittää, miten tulokset palautetaan. Eli nyt

run_sql(select(TranslationService.service_name)).scalars().all()

palauttaa aina yksinkertaisimman listan, eli list[str].

Tässä tapauksessa koodiin jäi typo, joka sai polun palauttamaan jokaisen kääntäjän nimen ensimmäisen kirjaimen. Nyt on tämä korjattu :)

@dezhidki dezhidki force-pushed the upgrade-dev-tools branch 8 times, most recently from ba3cca9 to 4c4c072 Compare August 4, 2023 13:58
@dezhidki dezhidki marked this pull request as ready for review August 4, 2023 13:58
@dezhidki
Copy link
Member Author

dezhidki commented Aug 4, 2023

Jätän DynamicMapped-viitteiden päivittämisen myöhemmäksi, sillä SQLAlchemy 2.0 edelleen tukee ne. Täten siis kaikki olennaisin on korjattu.

Jäljelle jää siis vaan testaaminen https://timdevs02.it.jyu.fi:ssä.

@dezhidki
Copy link
Member Author

dezhidki commented Sep 14, 2023

Pastean tähän oman listan asioista, jotka ovat vielä testaamatta ennen mergetystä:

  • CLI commands:

    • admin/import_accounts.py
    • admin/item_cli.py
    • admin/associate_old_uploads.py
    • admin/fix_orphan_documents.py
    • admin/answer_cli.py
    • admin/user_cli.py
    • admin/language_cli.py
  • Scheduled functions and Celery stuff:

    • celery_sqlalchemy_scheduler/schedulers.py
  • Styles (adding and selecting):

    • user/settings/styles.py
  • Message lists (creating, editing settings):

    • messaging/messagelist/routes.py
    • messaging/messagelist/emaillist.py
  • TIM messages (creating, viewing, marking as read, replying):

    • messaging/timMessage/routes.py
  • Contacts and verifications (adding/removing emails, setting as primary):

    • user/contacts.py
  • Peer reviewing:

    • answer/routes.py
    • peerreview/util/peerreview_utils.py
  • Annotations (adding, editing, deleting) for both answers and in documents:

    • velp/annotation.py
  • Velp groups (creating, changing selection):

    • velp/velp.py
  • Sessions:

    • auth/session/routes.py
  • TaskBlocks (model answer locking)

    • item/taskblock.py
  • Calendar (adding events, subsciribing to events, exporting calendar as ICAL)

    • plugin/calendar/calendar.py
  • Document tags (creating, searching documents by tags):

    • item/routes_tags.py
  • User creation and permission editing via JSRunner:

    • plugin/jsrunner/util.py
  • Lectures (creating, commenting, questions):

    • lecture/routes.py
  • Editing preferences

@saviit
Copy link
Contributor

saviit commented Sep 14, 2023

Nopeasti lokaalisti testattuna velppaus ja velppiryhmät näyttäis toimivan ok. Huomasin pari pientä bugia, mutta ne taitaa olla jo aikaisemmin olemassa olleita.

* Mark relationship overlaps
* Remove TimDb class as unused and unsupported
The API is used by SQLAlchemy 2.0 as the primary approach to querying
Based on the recommendations of SQLAlchemy, selectin loading should be preferred over joined loading for all relationships where there is a chance of database duplicating the rows.
Instead of using references like db.relationship or db.Index, this commit refactors to use directly SQA's API for brevity and better typing.
db.Model is replaced by TIM's own DbModel that inherits DeclarativeBase. This allows future-proof any behaviour changes to SQA or SQA-Flask
This commit adds a run_sql helper which can be used to execute SQL queries. All current uses of basic SQL execution are replaces to use run_sql instead
@dezhidki dezhidki force-pushed the upgrade-dev-tools branch 2 times, most recently from e9c485e to 3cfb3ef Compare September 15, 2023 16:35
@dezhidki
Copy link
Member Author

Kaikki osat ovat nyt testattu. Katson PRn koodin vielä läpi, mutta lähtökohtaisesti nyt on oikea aika mergetä se. Laitan ilmoituksen päivityksestä tänään yöllä, sillä uskon ehtiväni tarkastaa toimivuuden ennen sitä.

@dezhidki dezhidki merged commit d5136e5 into master Sep 15, 2023
27 checks passed
@dezhidki dezhidki deleted the upgrade-dev-tools branch September 28, 2023 08:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants