如何使用sqlalchemy2.0+定义外键
时间: 2023-12-25 18:06:19 浏览: 173
SqlAlchemy教程+学习文档
在SQLAlchemy中定义外键可以使用ForeignKey约束。下面是一个示例代码:
```python
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
engine = create_engine('sqlite:///example.db', echo=True)
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
addresses = relationship("Address", back_populates="user")
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email_address = Column(String, nullable=False)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship("User", back_populates="addresses")
Base.metadata.create_all(engine)
```
在这个示例中,我们定义了两个表:User和Address。Address表中有一个外键user_id,它引用了User表中的id列。这个外键使用ForeignKey约束来定义。
在User表的定义中,我们使用了relationship属性来定义与Address表的关系。这个属性告诉SQLAlchemy,User表的每个实例都有一个addresses属性,它是一个包含所有与该用户相关的Address实例的列表。
当我们使用这些模型类时,例如:
```python
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
user = User(name='John Doe')
address = Address(email_address='john.doe@example.com', user=user)
session.add(user)
session.add(address)
session.commit()
user = session.query(User).filter_by(name='John Doe').one()
print(user.addresses)
```
我们可以看到,我们可以通过user.addresses属性访问与该用户相关的所有地址。这是通过relationship属性定义的。
阅读全文