search

Home  >  Q&A  >  body text

python - sqlalchemy many to one

迷茫迷茫2860 days ago643

reply all(1)I'll reply

  • 大家讲道理

    大家讲道理2017-04-17 14:26:31

    The situation is the same as when a Post has multiple Tags.

    --- Update

    I found that I can’t write either, sweat

    I thought it was a problem with Handling Multiple Join Paths. Conflicts can be avoided by specifying foreign_keys. relationship("Address",foreign_keys=[billing_address_id])

    But it will not be written when there is only one foreign_keys.

    python#!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from sqlalchemy import create_engine
    engine = create_engine("mysql://root:root@localhost/think", echo=True)
    from sqlalchemy.ext.declarative import declarative_base
    Base = declarative_base()
    
    from sqlalchemy import Column, Integer, SmallInteger, String , DateTime, ForeignKey
    from sqlalchemy.orm import relationship, backref
    
    from datetime import datetime
    
    # Post
    class Post(Base):
         __tablename__ = 'Post'
         id = Column(Integer, primary_key=True)
         title = Column(String(100), index=True)
         content = Column(String(100), index=True)
         pics = relationship("Pic", backref=backref('Post', order_by=id))
    
         date = Column(DateTime, default=datetime.now())
    
    
         def __init__(self, title, content):
             self.title = title
             self.content = content
    
         def __repr__(self):
             return "{title:%s,title_pic:%s,content:%s,content_pic:%s}" \
                    % (self.title,self.pics[0],self.content,self.pics[1:])
    
    
    # 图片
    class Pic(Base):
        __tablename__ = 'Pic'
        id = Column(Integer, primary_key=True)
        name = Column(String(10), index=True, unique=True)
        data = Column(String(100), index=True, unique=True)
        post_id = Column(Integer, ForeignKey('Post.id'))
    
        def __init__(self, name, data):
            self.name = name
            self.data = data
    
        def __repr__(self):
             return "{name:%s,data:%s}" % (self.name,self.data)
    
    
    if '__main__' == __name__ :
    
        from sqlalchemy.orm import sessionmaker
        Session = sessionmaker(bind=engine)
        session = Session()
    
        # 1
        Base.metadata.drop_all(engine)
        Base.metadata.create_all(engine)
    
        # 2
        one = Post("h1", "lalala")
        one.pics.append(Pic("title_pic","img0.bmp"))
        one.pics.append(Pic("p0","img1.bmp"))
        one.pics.append(Pic("p1","img2.bmp"))
        one.pics.append(Pic("p2","img3.bmp"))
    
        two = Post("h2", "hahaha")
        two.pics.append(Pic("title_pic2","img20.bmp"))
        two.pics.append(Pic("p20","img21.bmp"))
        two.pics.append(Pic("p21","img22.bmp"))
        two.pics.append(Pic("p22","img23.bmp"))
    
    
        session.add_all([one,two])
        session.commit()
    
        # 3
        ret = session.query(Post).filter(Post.title == "h2").one()
        print ret
    
    
        session.close()
    

    reply
    0
  • Cancelreply