Created
September 21, 2016 11:19
-
-
Save nenodias/a90d94ff1d541373f8605d898275213f to your computer and use it in GitHub Desktop.
SQL Alchemy migrate data from a database to another
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from sqlalchemy import create_engine, MetaData, | |
from sqlalchemy import Column, Integer, String, Table | |
from sqlalchemy.ext.declarative import declarative_base | |
from sqlalchemy.orm import sessionmaker | |
# Engine to the database to query the data from | |
# (postgresql) | |
source_engine = create_engine('sqlite:///:memory:', echo=True) | |
SourceSession = sessionmaker(source_engine) | |
# Engine to the database to store the results in | |
# (sqlite) | |
dest_engine = create_engine('sqlite:///:memory:', echo=True) | |
DestSession = sessionmaker(dest_engine) | |
# Create some toy table and fills it with some data | |
Base = declarative_base() | |
class Pet(Base): | |
__tablename__ = 'pets' | |
id = Column(Integer, primary_key=True) | |
name = Column(String) | |
race = Column(String) | |
Base.metadata.create_all(source_engine) | |
sourceSession = SourceSession() | |
sourceSession.add(Pet(name="Fido", race="cat")) | |
sourceSession.add(Pet(name="Ceasar", race="cat")) | |
sourceSession.add(Pet(name="Rex", race="dog")) | |
sourceSession.commit() | |
# This is the query we want to persist in a new table: | |
query= sourceSession.query(Pet.name, Pet.race).filter_by(race='cat') | |
# Build the schema for the new table | |
# based on the columns that will be returned | |
# by the query: | |
metadata = MetaData(bind=dest_engine) | |
columns = [Column(desc['name'], desc['type']) for desc in query.column_descriptions] | |
column_names = [desc['name'] for desc in query.column_descriptions] | |
table = Table("newtable", metadata, *columns) | |
# Create the new table in the destination database | |
table.create(dest_engine) | |
# Finally execute the query | |
destSession = DestSession() | |
for row in query: | |
destSession.execute(table.insert(row)) | |
destSession.commit() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment