Python 基于相关对象的SQLAlchemy ORM插入

Python 基于相关对象的SQLAlchemy ORM插入,python,orm,sqlalchemy,Python,Orm,Sqlalchemy,这是一个新手问题。我是ORM新手,我想知道是否有以下可能: 假设我有一个“users”表,其中有三个字段:“id”、“user\u name”和一个外键“country\u id”,指向表“countries” 现在,如果我想插入一个新用户,我首先在“countries”表中查找国家的id(例如11),然后创建一个user实例(声明性基本对象) 我想知道的是,如果可以直接添加新用户,只传递国家名称。。。大概是这样的: new_user = User('Johnny', Country('Spa

这是一个新手问题。我是ORM新手,我想知道是否有以下可能:

假设我有一个“users”表,其中有三个字段:“id”、“user\u name”和一个外键“country\u id”,指向表“countries”

现在,如果我想插入一个新用户,我首先在“countries”表中查找国家的id(例如11),然后创建一个user实例(声明性基本对象)

我想知道的是,如果可以直接添加新用户,只传递国家名称。。。大概是这样的:

new_user = User('Johnny', Country('Spain')) # Note the country instance
session.add(new_user)
我尝试过类似的方法,但我得到的最好结果是ORM尝试插入另一个国家,名为西班牙


提前谢谢

假设
西班牙
已插入数据库,则需要以下内容:

new_user = User(name='Johnny', country_id=session.query(Country).filter_by(name='Spain').one().id)
更清晰的说法是:

country = session.query(Country).filter_by(name='Spain').one()
new_user = User(name='Johnny', country_id=country.id)
如果定义了
User.country
,则可以是:

country = session.query(Country).filter_by(name='Spain').one()
new_user = User(name='Johnny', country=country)
如果
User.country
关系定义了
users
关系(默认情况下将映射到
列表),您还可以执行以下操作:

country = session.query(Country).filter_by(name='Spain').one()
country.users.add(User(name='Johnny'))

假设
西班牙
已插入数据库,则需要以下内容:

new_user = User(name='Johnny', country_id=session.query(Country).filter_by(name='Spain').one().id)
更清晰的说法是:

country = session.query(Country).filter_by(name='Spain').one()
new_user = User(name='Johnny', country_id=country.id)
如果定义了
User.country
,则可以是:

country = session.query(Country).filter_by(name='Spain').one()
new_user = User(name='Johnny', country=country)
如果
User.country
关系定义了
users
关系(默认情况下将映射到
列表),您还可以执行以下操作:

country = session.query(Country).filter_by(name='Spain').one()
country.users.add(User(name='Johnny'))

这就是我正在做的。但仍然有一种感觉,它有点“太手工了”,也许有一种更干净的方法可以得到它。谢谢!当我尝试执行
country=session.query(country).filter\u by(name='Spain')new\u user=user(name='Johnny',country=country)
时,我收到一个“'query'对象没有属性'\u sa_instance\u state'”。它只在我使用country.first()时有效,但这会创建两个SQL查询(select、insert)。感谢您指出缺少
.one()
.first()
方法调用来实际检索@Pakman实例。关于你提到的另一点,要么你已经事先知道国家ID并使用它来插入用户而不首先查询数据库,要么如果你只知道名称,我看不到任何方法可以首先通过名称查询数据库中的国家ID。这就是我正在做的。但仍然有一种感觉,它有点“太手工了”,也许有一种更干净的方法可以得到它。谢谢!当我尝试执行
country=session.query(country).filter\u by(name='Spain')new\u user=user(name='Johnny',country=country)
时,我收到一个“'query'对象没有属性'\u sa_instance\u state'”。它只在我使用country.first()时有效,但这会创建两个SQL查询(select、insert)。感谢您指出缺少
.one()
.first()
方法调用来实际检索@Pakman实例。关于你提到的另一点,要么你已经事先知道国家ID并使用它来插入用户而不首先查询数据库,要么如果你只知道名称,我看不出有任何方法可以首先通过名称查询数据库中的国家ID。你用什么工具生成该图表?嗨,我使用了wwwsqldesigner。您使用了什么工具生成该图表?嗨,我使用了wwwsqldesigner。