but note that you can have the FOREIGN KEY in your database and not have the ForeignKey object in Python. In your alembic migration you can use ForeignKey within op.create_table() and that part will actually work, because it works around there being no other table around. But on the autogenerate side, nope.
On Fri, Apr 13, 2018 at 7:41 PM, Mike Bayer <mike...@zzzcomputing.com> wrote: > On Fri, Apr 13, 2018 at 5:54 PM, Ashu Goel <soxfan...@gmail.com> wrote: >> Err why would I do #3? This is a just a simple reproduction of my actual >> problem, in which the tables are obviously more fleshed out, and I would >> actually want to enforce that the value referenced in the foreign key column >> actually existed in the foreign table. Am I missing something? > > no function of the ForeignKey python object will work if it can't find > a Table object that it refers towards and it will do nothing towards > being aware of this constraint or making any use of it (most > operations will fail with a similar error as what you are getting). > So you need to decide how you'd like it to do that (metadata shared, > or pass it the Column object). > > > >> >> I'm fine with doing #1 or #2 but just wanted to make sure that was the only >> way. >> >> On Friday, April 13, 2018 at 2:51:14 PM UTC-7, Mike Bayer wrote: >>> >>> On Fri, Apr 13, 2018 at 5:11 PM, Ashu Goel <soxf...@gmail.com> wrote: >>> > Hey there, >>> > >>> > I am trying to setup a multi-schema database, where each schema has it's >>> > own >>> > metadata and tables, but ForeignKey constraints are allowed to cross >>> > schemas. This usually works fine until I start introducing something >>> > like >>> > alembic revision autogeneration, which uses the sorted_tables feature of >>> > the >>> > metadata, in which case I get errors because sqlalchemy cannot find the >>> > table referenced by the foreign key. I've attached a simple script that >>> > showcases my findings, along >>> > with the stacktrace below. I understand that a simple fix would be to >>> > use >>> > actual model object instead of a string to reference the foreign column, >>> > but >>> > ideally would like to continue using strings in case we ever decide to >>> > break >>> > up the code into different projects pointing to the same database. Any >>> > thoughts? >>> >>> >>> here are your choices: >>> >>> 1. put the two tables on the same MetaData object >>> >>> 2. use the column object in the ForeignKey, not the string >>> >>> 3. don't use ForeignKey. >>> >>> Looks like you want to use #3 because the ForeignKey construct here is >>> completely useless without it being able to find the other Table, it's >>> not buying you anything. >>> >>> >>> >>> > >>> > Traceback (most recent call last): >>> > File "simple.py", line 21, in <module> >>> > print(metadata_two.sorted_tables) >>> > File >>> > >>> > "/Users/ashu/Documents/server/env/lib/python3.5/site-packages/sqlalchemy/sql/schema.py", >>> > line 3842, in sorted_tables >>> > return ddl.sort_tables(sorted(self.tables.values(), key=lambda t: >>> > t.key)) >>> > File >>> > >>> > "/Users/ashu/Documents/server/env/lib/python3.5/site-packages/sqlalchemy/sql/ddl.py", >>> > line 1028, in sort_tables >>> > tables, filter_fn=_skip_fn, extra_dependencies=extra_dependencies) >>> > File >>> > >>> > "/Users/ashu/Documents/server/env/lib/python3.5/site-packages/sqlalchemy/sql/ddl.py", >>> > line 1095, in sort_tables_and_constraints >>> > dependent_on = fkc.referred_table >>> > File >>> > >>> > "/Users/ashu/Documents/server/env/lib/python3.5/site-packages/sqlalchemy/sql/schema.py", >>> > line 3002, in referred_table >>> > return self.elements[0].column.table >>> > File >>> > >>> > "/Users/ashu/Documents/server/env/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py", >>> > line 767, in __get__ >>> > obj.__dict__[self.__name__] = result = self.fget(obj) >>> > File >>> > >>> > "/Users/ashu/Documents/server/env/lib/python3.5/site-packages/sqlalchemy/sql/schema.py", >>> > line 1891, in column >>> > tablekey) >>> > sqlalchemy.exc.NoReferencedTableError: Foreign key associated with >>> > column >>> > 'table_two.one_id' could not find table 'one.table_one' with which to >>> > generate a foreign key to target column 'id' >>> > >>> > >>> > Thanks! >>> > Ashu >>> > >>> > -- >>> > SQLAlchemy - >>> > The Python SQL Toolkit and Object Relational Mapper >>> > >>> > http://www.sqlalchemy.org/ >>> > >>> > To post example code, please provide an MCVE: Minimal, Complete, and >>> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full >>> > description. >>> > --- >>> > 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+...@googlegroups.com. >>> > To post to this group, send email to sqlal...@googlegroups.com. >>> > Visit this group at https://groups.google.com/group/sqlalchemy. >>> > For more options, visit https://groups.google.com/d/optout. >> >> -- >> SQLAlchemy - >> The Python SQL Toolkit and Object Relational Mapper >> >> http://www.sqlalchemy.org/ >> >> To post example code, please provide an MCVE: Minimal, Complete, and >> Verifiable Example. See http://stackoverflow.com/help/mcve for a full >> description. >> --- >> 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 https://groups.google.com/group/sqlalchemy. >> For more options, visit https://groups.google.com/d/optout. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- 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 https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.