2016-10-10 2 views
0

Bitte entschuldigen Sie jegliche Tippfehler, haben Sie nicht viel Erfahrung mit anderen Datenbanken als SQLite. Ich versuche zu replizieren, was ich in SQLite tun würde, wo ich eine Datenbank an eine zweite Datenbank anhängen und quer über alle Tabellen abfragen könnte. Ich benutzte SQLAlchemy nicht mit SQLiteSQLAlchemy findet keine Postgres-Tabelle, die mit postgres_fdw verbunden ist

Ich arbeite mit SQLAlchemy 1.0.13, Postgres 9.5 und Python 3.5.2 (mit Anaconda) auf Win7/54. Ich habe zwei Datenbanken (auf localhost) mit postgres_fdw verbunden und einige der Tabellen von der Sekundärdatenbank importiert. Ich kann die verbundene Tabelle erfolgreich mit SQL in PgAdminIII und von Python mit psycopg2 abfragen. Mit SQLAlchemy habe ich versucht:

# Same connection string info that psycopg2 used 
engine = create_engine(conn_str, echo=True) 

class TestTable(Base): 
    __table__ = Table('test_table', Base.metadata, 
         autoload=True, autoload_with=engine) 

    # Added this when I got the error the first time 
    # test_id is a primary key in the secondary table 
    Column('test_id', Integer, primary_key=True) 

und den Fehler:

sqlalchemy.exc.ArgumentError: Mapper Mapper|TestTable|test_table could not 
assemble any primary key columns for mapped table 'test_table' 

Dann habe ich versucht:

insp = reflection.Inspector.from_engine(engine) 
print(insp.get_table_names()) 

und den beigefügten Tabellen nicht aufgeführt sind (die Tabellen aus der Primärdatenbank wird angezeigt). Gibt es eine Möglichkeit, das zu tun, was ich erreichen möchte?

Antwort

1

Um eine Tabelle zu bilden SQLAlchemy needs there to be at least one column denoted as a primary key column. Dies bedeutet nicht, dass die Spalte tatsächlich eine Primärschlüsselspalte in den Augen der Datenbank sein muss, obwohl es eine gute Idee ist. Je nachdem, wie Sie die Tabelle aus Ihrem Fremdschema importiert haben, enthält sie möglicherweise keine Darstellung einer Primärschlüsseleinschränkung oder anderer Einschränkungen.

engine = create_engine(conn_str, echo=True) 

test_table = Table('test_table', Base.metadata, 
        autoload=True, autoload_with=engine) 

class TestTable(Base): 
    __table__ = test_table 
    __mapper_args__ = { 
     'primary_key': (test_table.c.test_id,) # candidate key columns 
    } 

zu inspizieren fremden Tabellennamen die Verwendung: Sie können entweder overriding the reflected primary key column im Table Instanz (nicht in der abgebildeten Klassen Körper), oder noch besser sagen die Mapper, welche Spalten umfassen die Kandidatenschlüssel dieses Problem umgehen PGInspector.get_foreign_table_names() methode:

print(insp.get_foreign_table_names()) 
+0

Danke, es funktioniert. – RunDeep

Verwandte Themen