[PYTHON] Verarbeitung von DB-Tabelleneinfügungen mit sqlalchemy

ex1) Fügen Sie mehrere Datensätze in eine beliebige Tabelle ein (1)

Am Anfang widerstrebend, aber ehrlich? Der Datensatz wurde zeilenweise in die Tabelle eingefügt, indem der Vorgang zum Festlegen des Werts jeder Spalte in myobject und session.add (myobject) in einer for-Schleife wiederholt wurde.

sql_insert_old.py



Base = sqlalchemy.ext.declarative.declarative_base()

class Hogega_tmp(Base):
    __tablename__ = 'hogega_tmps'
    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
    y = sqlalchemy.Column(sqlalchemy.String(10))
    m = sqlalchemy.Column(sqlalchemy.String(10))
    d = sqlalchemy.Column(sqlalchemy.String(10))
    dim4 = sqlalchemy.Column(sqlalchemy.String(100))
    pv = sqlalchemy.Column(sqlalchemy.String(50))
    rsf = sqlalchemy.Column(sqlalchemy.String(10))
    fld = sqlalchemy.Column(sqlalchemy.String(10))

def orm(data,fld):
    
    #SQL Alchemy-Initialisierung
    CONNECT_INFO = 'mssql+pyodbc://hogehoge'
    engine = sqlalchemy.create_engine(CONNECT_INFO, encoding='utf-8')

    #Erstellen Sie eine Sitzung
    Session = sqlalchemy.orm.sessionmaker(bind=engine)
    session = Session()

    #Mit oder ohne Zufallsstichprobenfunktion
    if data["containsSampledData"]:
       rsf=1
    else:
       rsf=0
    cnt=data["totalResults"]
    print(ref)

    #Fügen Sie Datensätze nacheinander durch Schleifenverarbeitung in die Tabelle ein
    if cnt!=0: 
       for i,n in enumerate(data["rows"]): 
           print(i)
           if fld.find("source")!= -1: 
               myobject = Hogega_tmp(y=n[0],m=n[1],d=n[2],dim4=n[3],pv=n[4]
                                     rsf=rsf,fld=fld)
       
           session.add(myobject) #Zeile einfügen
           if fld.find("source")!= -1 and i>=24: #Begrenzte Anzahl von Einfügungen
                  break
       session.commit() #verpflichten
    session.close() #Sitzung schließen

Hinweis) Oben wird beispielsweise angenommen, dass das Ergebnis der Ausführung der API von Google Analytics in SQL Server gespeichert ist.

Beispiel 2) Fügen Sie mehrere Datensätze in eine beliebige Tabelle ein (Teil 2).

Es ist nicht cool, das Einfügen von Zeilen nacheinander zu wiederholen, oder sogar mit SQL können mehrere Daten zusammen mit einer Insert-Anweisung eingefügt werden. Das folgende Skript wollte daher prüfen, ob dies mit Sqlalchemy erreicht werden kann.

sql_insert_new.py



def orm2(data,fld):
    
    #SQL Alchemy-Initialisierung
    CONNECT_INFO = 'mssql+pyodbc://hogehoge'
    engine = sqlalchemy.create_engine(CONNECT_INFO, encoding='utf-8')

    #Erstellen Sie eine Sitzung
    Session = sqlalchemy.orm.sessionmaker(bind=engine)
    session = Session()

    #Mit oder ohne Zufallsstichprobenfunktion
    if data["containsSampledData"]:
       rsf=1
    else:
       rsf=0


    clm =["y","m","d","dim4","pv","rsf","fld"]
    ex=[rsf,fld]
    cnt=data["totalResults"]

    if cnt!=0: 
       rws = data["rows"]   
       if fld.find("source")!= -1: 
          rws = rws[:25] #Begrenzte Anzahl von Einfügungen

       #Zeile einfügen
       lst = [dict(zip(clm,r+ex)) for r in rws ] #Generierung von Wertklauseln
       ins_statement = Hogega_tmp.__table__.insert().values(lst)
       session.execute(ins_statement)   
       session.commit()
       session.close()

Ergänzung

Wenn Sie die folgende "Liste mit mehreren Wörterbüchern" in den Argumentteil (lst) der Insert-Anweisung schreiben, können Sie mehrere Daten stapeln, ohne den Einfügevorgang einzeln in der for-Schleife zu wiederholen. Es scheint, dass Sie eine Tabellenzeile mit einfügen können. (Das heißt, es entspricht der Values-Klausel von "Insert In ... Values ..." in SQL)

sql_insert_apdx1.py


[{y:2016,m:5,d:1,dim4:yahoo,pv:100},
 {y:2016,m:5,d:1,dim4:google,pv:200},
    ...
 {y:2016,m:5,d:1,dim4:smartnews,pv:300}]

In der obigen sql_insert_new.py wird lst in der Listeneinschlussnotation das folgende Bild, wenn die Bedeutung der Verarbeitung aufgeschlüsselt ist.

sql_insert_apdx2.py


lst = list()
for r in rws:
    vle = r+ex
    y = dict(zip(clm,vle)
    lst.append(y)

(Vle entspricht dem in der Tabelle gespeicherten Wert, clm entspricht dem Tabellenspaltennamen, und diese beiden Sequenzen werden von ZIP () aufgelistet und in den Wörterbuchtyp y umgewandelt, und der Vorgang des sequentiellen Hinzufügens zur Liste lst wird in einer for-Schleife wiederholt Bedeutung)

Recommended Posts

Verarbeitung von DB-Tabelleneinfügungen mit sqlalchemy
DB-Einstellungen bei Verwendung von Django + SQLAlchemy + Alembic
Lesen dynamisch generierter Tabellendefinitionen mit SQL Alchemy
Rückkehr nach dem Gaußschen Verfahren
Tabellendefinition in SQL Alchemy
Tipps zur Definition von sqlalchemy-Tabellen
Durchsuchen Sie die Tabelle mit sqlalchemy und erstellen Sie ein Wörterbuch
Generieren Sie mithilfe von sqlacodegen SQL Alchemy-Tabellendefinitionen von einem vorhandenen MySQL-Server
Gaußsche Prozessregression mit GPy
Holen Sie sich die Tabelle dynamisch mit sqlalchemy
SQLAlchemy + DB-Migration durch Alembic
Versuchen Sie es mit SQLAlchemy + MySQL (Teil 1)
Versuchen Sie es mit SQLAlchemy + MySQL (Teil 2)
Prozess auf GPU mit chainer.cuda.elementwise