Topic: SQLAlchemy - SQlite - Python3: impostazione del codice  (Letto 123 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Buonasera  a Tutti,
da poco ho iniziato a studiarmi SQLAlchemy da usare con dialetto SQlite e sto provando ad impostare il codice in questo modo (riporto in esempio sintetico):

Ho il modulo main, più altri moduli funzionali all'applicazione, dove creo un'istanza della mia classe del database:
def main():
import time

# istanza di DataBase
#import dataBase
# creo il database
from tests.AlchemyORM_test.DATA import dataBase
istanceDB = dataBase.DataBase()

# popolo di tabelle il database
istanceDB.writeTables()

# inserisco dati in una tabella
adesso = time.time()
istanceDB.writeMainTable("MOLESAETERNA", adesso)

# query del database
dati = istanceDB.queryDB()
print(f"dati:{dati}")

if __name__ == "__main__":
main()


L'istanza della mia classe database (dataBase.py) mi serve per controllare il database (query ed altro) da qualsiasi punto del codice:

class DataBase():
def __init__(self):
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

self.Base = declarative_base()

self.engine = create_engine("sqlite:///dbRTB.db", echo=True)
Session = sessionmaker(bind=self.engine)
self.session = Session()

def writeTables(self):
from tests.AlchemyORM_test.DATA.tabelle import writeTables as wt
wt(self)

def writeMainTable(self, *args):
from tests.AlchemyORM_test.DATA.tabelle import writeMainTable as wmt
wmt(*args)

def queryDB(self):
return self.session.query(MainDataBase).all()

In questo codice già riscontro un problema (errore): nell'ultima riga
return self.session.query(MainDataBase).all()

non so come indicargli il nome della classe della tabella di cui voglio venga effettuata la query.

In questo modulo (tabelle.py) costruisco il mio database, con le classi delle tabelle e qui vorrei effettuare anche parte delle operazioni su di esse:
def writeTables(istanceDB):
from sqlalchemy import Column, Integer, String, DateTime

# CLASSI TABELLE
class MainTable(istanceDB.Base):
__tablename__ = "mainDataBase"

id = Column(Integer, primary_key=True)
intestazione = Column(String)
dataCreazione = Column(DateTime)

def __repr__(self):
return f"MainTable {self.intestazione}"
# ===============
class UserTable(istanceDB.Base):
__tablename__ = "userTable"

id = Column(Integer, primary_key=True)
user = Column(String)
nickname = Column(String)

def __repr__(self):
return f"UserTable {self.user}"

# crea le tabelle
istanceDB.Base.metadata.create_all(istanceDB.engine)

def writeMainTable(*args):
dati = MainTable(intestazione=args[0], dataCreazione=args[1])
istanceDB.session.add(dati)

Anche qui ho dei problemi/errori, nell'ultima funzione:
def writeMainTable(*args):
dati = MainTable(intestazione=args[0], dataCreazione=args[1])
istanceDB.session.add(dati)

Ovvero non riesco a passargli la classe MainTable riferita alla tabella su cui costruire la query e la stessa istanza del database (istanceDB).

Non so se ho reso chiara l'idea di come vorrei costruire il codice,
non so nemmeno se è la maniera giusta e corretta.
Chiedo un aiuto e consigli. Grazie.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.062
  • Punti reputazione: 9
    • Mostra profilo
Re:SQLAlchemy - SQlite - Python3: impostazione del codice
« Risposta #1 il: Giugno 26, 2020, 22:30 »
Mah, guarda... è un po' tutto un pasticcio... per usare sqlalchemy ci vogliono dei requisiti - occorre saper programmare in python, almeno quel tanto che basta a interiorizzare i concetti di namespace e scope delle variabili, per esempio. E poi imparare che cosa sono le classi, come funzionano, che cosa fanno. Non ha molto senso fare degli import dentro delle funzioni, e ancora meno dichiarare classi all'interno di funzioni, cose del genere. Non puoi aspettarti di ritrovare fuori dalle funzioni (e quindi a "passare") dei nomi che hai dichiarato nel namespace locale. Appiattisci quel codice di dieci o cento volte, prima.
Per l'uso di sqlalchemy, io penso che il tutorial sia abbastanza chiaro https://docs.sqlalchemy.org/en/13/orm/tutorial.html ma se vuoi puoi anche vedere questo articolo per esempio https://www.blog.pythonlibrary.org/2010/09/10/sqlalchemy-connecting-to-pre-existing-databases/ (che però è stato scritto 10 anni fa... leggi solo le parti relative all'uso di declarative, il resto oggi è decisamente obsoleto).
Delle ottime indicazioni sull'organizzazione del codice le trovi nella documentazione quando discute l'oggetto Session https://docs.sqlalchemy.org/en/13/orm/session_basics.html ... almeno io all'epoca le avevo trovate abbastanza illuminanti.

Però davvero, se il tuo stile di OOP in Python consiste nel dichiare un import dentro una classe dentro una funzione dentro un modulo che poi importi in un metodo di una classe di una funzione... ehm... forse c'è ancora qualche problema a monte di sqlalchemy...

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:SQLAlchemy - SQlite - Python3: impostazione del codice
« Risposta #2 il: Giugno 27, 2020, 00:49 »
Grazie Ric,, leggerò gli articoli che mi consigli.
Per il resto del codice hai pienamente ragione, ho pasticciato parecchio, mi riprometto di scriverlo meglio e postarlo per una nuova valutazione.