In SQLAlchemy, how do I create a ForeignKey relationship across 2 different .py files?

后端 未结 1 1041
攒了一身酷
攒了一身酷 2021-02-19 15:24

In user_models.py, I have this:

class Users(Base):
    __tablename__ = \'account_users\'
    id = Column(Integer, primary_key = True)
    username =         


        
相关标签:
1条回答
  • 2021-02-19 16:01

    The key is to use the same Base for both foreign keys, instead of creating a new one for each table.

    basetest.py

    from sqlalchemy import create_engine, ForeignKey
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship, backref
    from sqlalchemy import Column, Integer, String
    from sqlalchemy import Table, Text
    
    engine = create_engine('mysql://test:test@localhost/test1',
                        echo=False)
    
    Base = declarative_base()
    

    user_models.py

    from sqlalchemy import Column, Integer, String
    from sqlalchemy import Table, Text
    
    
    #Base = declarative_base()
    from basetest import Base
    
    class Users(Base):
        __tablename__ = 'account_users'
        __table_args__ = {'extend_existing':True}
        id = Column(Integer, primary_key = True)
        username = Column(String(255), nullable=False)    
    
    Base.metadata.create_all(engine)
    

    groups_models.py

    from sqlalchemy import create_engine, ForeignKey
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship, backref
    from sqlalchemy import Column, Integer, String
    from sqlalchemy import Table, Text
    
    from basetest import Base
    #Base = declarative_base()
    from test1 import Users
    
    class Groups(Base):
        __tablename__ = 'personas_groups'
        __table_args__ = {'extend_existing':True}
        id = Column(Integer, primary_key = True )
        user_id = Column(Integer, ForeignKey('account_users2.id')) #This creates an error!!!
        user = relationship(Users) #this probably won't work. But haven't hit this line yet.
    
    Base.metadata.create_all(engine)
    

    Make sure that you have same Base to create all related tables.

    0 讨论(0)
提交回复
热议问题