Bonjour à tous !
J'essaye d'intégrer un SGBDR à une application qui utilise actuellement le module pickle.
Les besoins de l'application ayant évolué mais restant toujours assez restreint, je me suis tourné vers sqlite que je connais déjà un petit peu.

Pour la première fois, j'ai regardé du côté des ORM et j'ai retenu sqlalchemy qui à l'air abouti et complet.

Je me heurte par contre à un gros problème. Je n'arrive pas à 'mapper' 2 de mes classes en Many to Many avec un attribut en plus des deux clefs étrangères dans la table associative.

Un peu de code pour expliquer mieux :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
from sqlalchemy import *
from sqlalchemy import  create_engine
from sqlalchemy.orm import *
from sqlalchemy.orm.collections import *
from sqlalchemy.ext.associationproxy import *
from sqlalchemy.ext.declarative import *
 
engine = create_engine('sqlite:///test.db', echo=True)
Base = declarative_base(bind=engine)
metadata = Base.metadata
 
 
# association table
post_keywords = Table('post_keywords', metadata,
    Column('post_id', Integer, ForeignKey('posts.id')),
    Column('keyword_id', Integer, ForeignKey('keywords.id'))
)
 
class User(Base):
    __tablename__ = 'users'
 
    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)
 
    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password
 
 
class BlogPost(Base):
    __tablename__ = 'posts'
 
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.id'))
    author = relation(User, backref=backref('posts', lazy='dynamic'))
    body = Column(Text)
 
    # many to many 
    keywords = relation('Keyword', secondary=post_keywords, backref='posts')
 
    def __init__(self, body, author):
        self.author = author
        self.body = body
 
class Keyword(Base):
    __tablename__ = 'keywords'
 
    id = Column(Integer, primary_key=True)
    keyword = Column(String(50), nullable=False, unique=True)
 
    def __init__(self, keyword):
        self.keyword = keyword
 
metadata.create_all(engine) 
 
Session = sessionmaker(bind=engine)
session = Session()
ed_user = User('zed', 'Zed Bows', 'password')
jo_user = User('jo', 'Jo lbdeo', 'pwd')
session.add(ed_user)
session.add(jo_user)
 
 
key1 = Keyword("keyword1")
key2 = Keyword("keyword2")
session.add(key1)
session.add(key2)
 
 
post1 = BlogPost("bodybodydbodezfdkjsdflksfdbody", jo_user)
post1.keywords.append(key1)
post1.keywords.append(key2)
session.add(post1)
 
session.commit()
Je voudrais donc rajouter à ce code, la possibilité d'avoir une colonne dans la table "post_keywords" qui ne soit pas une clef étrangère mais un simple attribut.

Ça fait un moment que je suis bloqué avec ce mistère et j'espère que quelqu'un ici présent trouvera une réponse à mon problème

Bonne soirée !