У меня есть таблица с 2 внешними ключами, которые сопоставляются с тем же первичным ключом другой таблицы. проблема, с которой я сталкиваюсь, заключается в том, что эти два внешних ключа могут быть независимыми значениями, однако они всегда устанавливаются на одно и то же при использовании SQLAlchemy.
таблицы (сокращенно):
CREATE TABLE table1 (
userid INT NOT NULL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
UNIQUE KEY(name)
);
CREATE TABLE table2 (
taskid INT NOT NULL PRIMARY KEY,
userid INT,
ownerid INT,
task VARCHAR(255) NOT NULL,
FOREIGN KEY (userid) REFERENCES users (userid),
FOREIGN KEY (ownerid) REFERENCES users (userid)
);
Я использую классический картограф из sqlalchemy, и мое определение класса:
class User:
def __init__( self, name ):
self.name = name
class Task:
def __init__( self, task, ownerid ):
self.task = task
self.ownerid = ownerid
ownerid и userid могут отличаться, т. Е. Ownerid - это пользователь, которому принадлежит задача, а userid - пользователь, создавший задачу.
Я создал сопоставления:
users_table = sqlalchemy.Table( 'users', self.metadata, autoload=True )
tasks_table = sqlalchemy.Table( 'tasks', self.metadata, autoload=True )
sqlalchemy.orm.mapper( User, users_table, properties= {
'tasks': sqlalchemy.orm.relationship(Task) } )
sqlalchemy.orm.mapper( Task, tasks_table, properties {
'user': sqlalchemy.orm.relationship( User, primaryjoin=tasks_table.c.userid==users_table.c.userid ),
'owner': sqlalchemy.orm.relationship( User, primaryjoin=tasks_table.c.ownerid==users_table.c.userid ) } )
и синтаксис для работы с этими объектами похож на:
дело 1:
u1 = User('burt')
t1 = Task( 'buy milk', u1.userid ) # this case is that the task is assigned to self
вариант 2:
u2 = User('kelly')
t2 = Task( 'review code', u1.userid ) # assign to burt, creator is kelly
в случае 2 у меня возникла проблема, поскольку ownerid всегда равен идентификатору пользователя, в этом
case для ownerid и userid всегда равны 2 (для Келли).