Hi I am not able to understand how to make a foreignkey reference using sqlalchemy. I have created a new table client in my database:
class Client(DeclarativeBase):
__tablename__ = 'client'
id = Column(Integer, primary_key=True)
user_id = Column(
Integer,
ForeignKey('user.id', ondelete='CASCADE'),
nullable=False,
index=True,
)
orgname = Column(Unicode, nullable=False)
def __init__(self, **kwargs):
super(Client, self).__init__(**kwargs)
Not I am trying to do something like this
u = User(user_name=u'dusual')
session.add(u)
c = Client(user=u, orgname="dummy_org")
session.add(c)
But sqlalchemy shouts back saying :
(k, cls_.name)) TypeError: 'user' is an invalid keyword argument for Client
Now shouldn't this be obvious that user should be allowed as a keyword argument how can I make sure my table is able to take user keyword argument.
To create a composite primary key, set primary_key to True on each column involved in the key. A boolean argument when set to False adds NOT NULL constraint while creating a column. Its default value is True .
First you need to supply a Primary Key for each model. Then you need to define one Foreign Key which refers to the Primary Key of the other model. Now you can define a relationship with a backref that allows direct access to the related model. In this case, the following 2 lines should look like this: request_id = db.
A foreign key in SQL is a table-level construct that constrains one or more columns in that table to only allow values that are present in a different set of columns, typically but not always located on a different table.
You need to define a relationship between User
and Client
models:
from sqlalchemy.orm import relationship
class Client(DeclarativeBase):
__tablename__ = 'client'
id = Column(Integer, primary_key=True)
user_id = Column(
Integer,
ForeignKey('user.id', ondelete='CASCADE'),
nullable=False,
# no need to add index=True, all FKs have indexes
)
user = relationship('User', backref='clients')
orgname = Column(Unicode, nullable=False)
# no need to add a constructor
Then you can associate instances of User
and Client
models in two ways - either by assigning an integer to Client.user_id
:
u = User(user_name=u'dusual')
session.add(u)
session.flush() # to make sure the id is fetched from the database
c = Client(user_id=u.id, orgname="dummy_org")
session.add(c)
or by assinging a User
instance to Client.user
.
u = User(user_name=u'dusual')
# no need to flush, no need to add `u` to the session because sqlalchemy becomes aware of the object once we assign it to c.user
c = Client(user=u, orgname="dummy_org")
session.add(c)
Actually, there's a third way - since we've configured a backref
on Client.user
, SQLAlchemy added a list-like clients
attribute to our User
model:
u = User(user_name=u'dusual')
u.clients.append(Client(orgname="dummy_org"))
session.add(u)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With