though really, all you need to do is process your tables in dependency order, assuming you have no self-referential foreign keys.
if you iterate through tables as follows: for table in metadata.sorted_tables: <copy table> you'd be moving the data in order of dependency. http://docs.sqlalchemy.org/en/rel_0_9/core/metadata.html?highlight=sorted_tables#sqlalchemy.schema.MetaData.sorted_tables On Oct 10, 2014, at 11:33 AM, Michael Bayer <mike...@zzzcomputing.com> wrote: > Assuming you're working with Oracle as is implied by your script, constraints > can be disabled as in: > > http://www.dba-oracle.com/t_enabling_disabling_constraints.htm > > that is, for each table, issue a "DISABLE CONSTRAINT" for each FK constraint > (using connection.execute("ALTER TABLE foo DISABLE CONSTRAINT xyz") ). These > are listed in table.foreign_keys, however if you want to get at Oracle's > generated names for each, you or you can use inspector.get_foreign_keys(). > See https://bitbucket.org/zzzeek/sqlalchemy/wiki/UsageRecipes/DropEverything > for an example of how to iterate through constraints. > > > > On Oct 10, 2014, at 11:03 AM, Eren Gölge <erengo...@gmail.com> wrote: > >> Here for example the code I use to transfer a table from my src DB to dst DB >> >> #!/usr/bin/env python >> >> >> import getopt >> import sys >> from sqlalchemy import create_engine, MetaData, Table >> from sqlalchemy.orm import sessionmaker >> from sqlalchemy.ext.declarative import declarative_base >> #from joblib import Parallel, delayed >> >> >> def make_session(connection_string): >> engine = create_engine(connection_string, echo=True, encoding='utf8') >> Session = sessionmaker(bind=engine) >> Base = declarative_base() >> return Session(), engine >> >> >> def create_all_tables(metadata): >> for table_name in metadata.tables.keys(): >> exec('global '+str(table_name)+'; '+str(table_name)+' = >> metadata.tables[table_name]') >> print table_name >> print 'TABLE CLASSES ARE CREATED !!!' >> >> >> def pull_data(from_db, to_db, tables): >> source, sengine = make_session(from_db) >> smeta = MetaData(bind=sengine) >> smeta.reflect(bind=sengine) >> destination, dengine = make_session(to_db) >> >> for table_name in tables: >> print 'Processing', table_name >> print 'Pulling schema from source server' >> # table = Table(table_name, smeta, autoload=True) >> table = smeta.tables[table_name] >> print 'Creating table on destination server' >> # table.metadata.create_all(dengine) >> table.create(dengine, checkfirst=True) >> data = sengine.execute(table.select()).fetchall() >> if data: >> print (table.insert()) >> dengine.execute(table.insert(), data) >> >> print 'Finished!' >> >> >> >> def print_usage(): >> print """ >> Usage: %s -f source_server -t destination_server table [table ...] >> -f, -t = driver://user[:password]@host[:port]/database >> >> >> Example: %s -f oracle://someuser:PaSsWd@db1/TSH1 \\ >> -t mysql://root@db2:3307/reporting table_one table_two >> """ % (sys.argv[0], sys.argv[0]) >> >> >> def quick_mapper(table): >> Base = declarative_base() >> class GenericMapper(Base): >> __table__ = table >> return GenericMapper >> >> >> # Call this from terminal >> if __name__ == '__main__': >> optlist, tables = getopt.getopt(sys.argv[1:], 'f:t:') >> >> >> options = dict(optlist) >> if '-f' not in options or '-t' not in options or not tables: >> print_usage() >> raise SystemExit, 1 >> >> >> pull_data( >> options['-f'], >> options['-t'], >> tables, >> ) >> >> >> >> >> >> And this is the error I get form my table >> >> sqlalchemy.exc.IntegrityError: (IntegrityError) (1452, 'Cannot add or update >> a child row: a foreign key constraint fails (`s... >> >> >> >> On Friday, 10 October 2014 17:44:24 UTC+3, Michael Bayer wrote: >> >> On Oct 10, 2014, at 10:30 AM, Eren Gölge <eren...@gmail.com> wrote: >> >> > I try to do basic ETL job with SQLalchemy but it always enforces relations >> > between tables. >> >> SQLAlchemy doesn't do anything like that. I think you are referring to the >> FOREIGN KEY constraints that are within your database. >> >> >> > I only like to copy the tables with the raw data inside without the >> > considration of table relations. How can I drop all those relations from >> > the DB metadata and copy the tables. >> >> You can drop or possibly temporarily disable FOREIGN KEY constraints on the >> database side. How this is done depends on the kind of database you're >> using. For example, with MySQL, it's very easy, use FOREIGN_KEY_CHECKS: >> http://www.sqlines.com/mysql/set_foreign_key_checks. >> >> >> > In addition I also need to create tables if they are not exist. The use of >> > create_all() function does not meet my needs because of the aforementioned >> > problems. >> >> I don't understand how an existing foreign key constraint interferes with >> the processing of a CREATE TABLE statement, you'd have to illustrate a >> specific example. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sqlalchemy" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to sqlalchemy+unsubscr...@googlegroups.com. >> To post to this group, send email to sqlalchemy@googlegroups.com. >> Visit this group at http://groups.google.com/group/sqlalchemy. >> For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.