【问题标题】:sqlalchemy : how can i map an existing class without modifying it?sqlalchemy:如何在不修改现有类的情况下映射它?
【发布时间】:2020-04-27 11:40:58
【问题描述】:

我有一定数量的 python 类,我想用 python sqlalchemy 映射到数据库中的表。我看到了映射类派生自 sqlalchemy 基类的示例。我不想那样做。有没有其他办法?

例如,如何映射这个简单的类?

class Person:
    def __init__(self, firstname: str = "x", name: str = "y", age: int = 0):
        self.firstname = firstname
        self.name = name
        self.age = age

    def __str__(self) -> str:
        return f"[{self.__firstname},{self.__name},{self.__age}]"

    @property
    def id(self):
       return self.__id

    @property
    def firstname(self) -> str:
        return self.__firstname

    @property
    def name(self) -> str:
        return self.__name

    @property
    def age(self) -> int:
        return self.__age

    # setters

    @id.setter
    def id(self, id: int):
        if not isinstance(id,int) or id<=0:
            raise MyException(f"...")

    @firstname.setter
    def firstname(self, firstname: str):
        if Utils.is_string_ok(firstname):
            self.__firstname = firstname.strip()
        else:
            raise MyException("...")

    @name.setter
    def name(self, name: str):
        if Utils.is_string_ok(name):
            self.__name = name.strip()
        else:
            raise MyException("...")

    @age.setter
    def age(self, age: int):
        error = False
        if isinstance(age, int):
            if age >= 0:
                self.__age = age
            else:
                error = True
        else:
            error = True
        if error:
            raise MyException("...")

例如,我想将它映射到包含列 (col1,col2,col3,col4) 的表(与类属性不同的任意名称)。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    对于任何感兴趣的人,我终于明白了(下面我更改了我的工作代码的标识符以匹配原始帖子):

    # imports
    from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData
    from sqlalchemy.orm import mapper, sessionmaker
    
    from Person import Person
    
    # mysql database
    engine = create_engine("mysql+mysqlconnector://root@localhost/dbpersonnes")
    
    # metadata
    metadata = MetaData()
    
    # table
    persons_table = Table("persons", metadata,
                            Column('col1', Integer, primary_key=True),
                            Column('col2', String(30), nullable=False),
                            Column("col3", String(30), nullable=False),
                            Column("col4", Integer, nullable=False)
                            )
    
    # mapping
    mapper(Person, persons_table, properties={
        'id': persons_table.c.col1,
        'firstname': persons_table.c.col2,
        'name': persons_table.c.col3,
        'age': persons_table.c.col4,
    })
    
    # session factory
    Session = sessionmaker()
    Session.configure(bind=engine)
    
    # session
    session = Session()
    
    # insert
    session.add(Personne(67, "x", "y", 10))
    session.commit()
    
    # query
    personnes = session.query(Personne).all()
    
    # logs
    for personne in personnes:
        print(personne)
    

    【讨论】:

      猜你喜欢
      • 2014-06-06
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      相关资源
      最近更新 更多