Sqlalchemy: SQl-Datei ausführen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Hallo,

gibt es irgendeine Möglichkeit, eine .sql-Datei mit Sqlalchemy (bzw. SqlSoup) einzulesen, und dann auszuführen?

Die Datei ist aus PHPMyadmin exportiert, und enthält mehre Befehle.

Liebe Grüße
Chris
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was sind das denn für Befehle?

Im einfachsten Fall sollte es so funktionieren, dass du die Datei zeilenweise einliest und jede Zeile (=jedes SQL-Statement) als "Roh-SQL" mit SQLAlchemy ausführst...

Gruß, noisefloor
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Verschiedene CREATE TABLE und INSERT INTO-Befehle...

Zeilenweise habe ich mir auch schon gedacht, aber sie sind teilweise über mehrere Zeilen verteilt, und eben immer SQL-konform mit ; getrennt..
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

noisefloor hat geschrieben: was sind das denn für Befehle?
Na, das klingt für mich nach Backup; könnten also neben insert-Statements auch create-Befehle sein.

Die DB-API2 hat ja die Cursor-methode `executemany()`; k.A. ob man an diese unter SQLAlchemy auch dran kommt bzw. etwas vergleichbares hat. Sollte aber in der Doku zu finden sein.

Die wichtigste Frage ist natürlich, wieso man das über SQLAlchemy machen will / muss?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Der Grund für SQLAlchemy ist, dass es mir ermöglicht, SqLite, Mysql, Postresql und all das andere zu nutzen. Es ist in der Tat nur ein Backup, um das es geht. Bzw um es anders zu sagen: Mein Programm hat seine Datenbankstruktur in einer .sql-Datei abgespeichert. Dem Anwender soll aber ermöglicht werden, es entweder lokal (Sqlite) oder extern (Mysql) zu nutzen, deswegen brauche ich Sqlalchemy.
BlackJack

@sprudel: Die Frage bleibt trotzdem warum Du *das* jetzt über SA machen willst. Das Backup wurde ja auch nicht mit SA erstellt, also warum willst Du das mit SA zurück spielen können? Die entsprechenden Kommandozeilenwerkzeuge der Datenbanken können das einfacher und sicher auch effizienter.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

sprudel hat geschrieben:Der Grund für SQLAlchemy ist, dass es mir ermöglicht, SqLite, Mysql, Postresql und all das andere zu nutzen. Es ist in der Tat nur ein Backup, um das es geht. Bzw um es anders zu sagen: Mein Programm hat seine Datenbankstruktur in einer .sql-Datei abgespeichert. Dem Anwender soll aber ermöglicht werden, es entweder lokal (Sqlite) oder extern (Mysql) zu nutzen, deswegen brauche ich Sqlalchemy.
Du hast mich missverstanden: Ich habe nicht die Verwendung von SA in Frage gestellt, sondern wieso man die Backups darüber einspielen muss ;-) Bei Daten kann ich das ja auch noch verstehen; aber die notwendigen `create`-Statements kann SA ja eben aufgrund des ORM automatisch ausführen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lunar

Das wird so auch eh nicht funktionieren. Die von phpmyadmin erstellte Datei enthält ziemlich sicher nicht nur Standard-SQL, sondern auch allerdings MySQL-spezifische Befehle, die andere DBMS nicht verstehen. SQLAlchemy ist auch nur dann datenbankunabhängig, wenn man es nur mit datenbankunabhängigen Befehlen nutzt. Selbst wenn es also einen Weg gibt, die Datei zu laden, und die darin enthaltenen Befehle an SQLAlchemy zu übergeben, so funktioniert das trotzdem nur, wenn SQLAlchemy mit einer MySQL-Datenbank verwendet wird.
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Hmm, ich glaube, da habt ihr recht.
Gibt es sonst irgendeine Möglichkeit, von SQLAlchemy datenbankübergreifend zu exportieren und zu importieren?
DAs Problem: Ich binde die Datenbanken mittels SqlSoap ein... aber ggf. wäre ich auch bereit, noch auf reines Sqlalchemy umzusteigen, wenn es damit wesentlich einfacher geht.
deets

Theoretisch kannst du mit zB SA declarative deine Entitaeten (und damit auch die Tabellen) definieren, und dann laedst du dir den Speicher mit dem kompletten Objektgraphen der ersten Datenbank. Dann bindest du eine neue connection an die MetaData-Instanz, und fuegst alle Objekte zur zu einer neuen Session hinzu.

UU musst du aber vorher pruefen, ob ein Objekt einer bestimmten ID schon existiert, und dann eventuell ein Objekt erstmal in den Speicher laden. Wenn's ganz bloede kommt in der Beziehung, dann musst du attributweise kopieren.

Code: Alles auswählen


from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()

class SomeClass(Base):
    __tablename__ = 'some_table'
    id = Column(Integer, primary_key=True)
    name =  Column(String(50))




Base.metadata.bind = 'sqlite:////tmp/db_a.sqlite'
Base.metadata.bind.echo = True

Session = scoped_session(sessionmaker(autocommit=False,
                                      autoflush=False,
                                      bind=Base.metadata.bind))
Base.metadata.create_all(Base.metadata.bind)

foo = SomeClass(name="foo")

Session.add(foo)
Session.commit()

Base.metadata.bind = 'sqlite:///tmp/db_b.sqlite'
Base.metadata.bind.echo = True

Base.metadata.create_all(Base.metadata.bind)
Session = scoped_session(sessionmaker(autocommit=False,
                                      autoflush=False,
                                      bind=Base.metadata.bind))

foo = SomeClass(name="foo")

Session.commit()
Und im Zweifel gilt: auf der Mailingliste fragen, Mr. SuperSupport Michael Bayer hilft bestimmt....
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
sprudel hat geschrieben:Ich binde die Datenbanken mittels SqlSoap ein... aber ggf. wäre ich auch bereit, noch auf reines Sqlalchemy umzusteigen, wenn es damit wesentlich einfacher geht.
Was impliziert, dass beide DBs die gleiche Struktur haben?! Wenn ja kannst du DB 1 auch einfach zeilenweise auslesen und in DB 2 schreiben. Das könnte man dann noch ausbauen, in dem man z.B. vor dem Kopieren prüft, welche Datensätze in DB2 schon vorhanden sind.

Gruß, noisefloor
deets

@noisefloor

Dasselbe Metamodell in SA impliziert nicht dasselbe Schema in beiden DBs. Und wie der OP ja schon sagte: es koennen verschiedene RDBMS zum Einsatz kommen.
Antworten