python - sqlalchemy:如何在不修改现有类的情况下映射它?
问题描述
我有一定数量的 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)的表(任意名称与类属性不同)。
解决方案
对于任何有兴趣的人,我终于明白了(下面我更改了我的工作代码的标识符以匹配原始帖子):
# 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)
推荐阅读
- javascript - 在 JSON 文件上写入写入但未保存
- r - 如何在闪亮的上下文中从传单交互式地图中删除背景
- javascript - 打字稿:防止使用“.name”来获取函数/类名
- wordpress - Wordpress 分页有时无法加载/显示
- linux - Linux Socket 超时适用于 WSL,但不适用于 Ubuntu
- python - 使用python分割拼贴图像
- javascript - 如何从函数返回的对象键和值生成一种类型的字符串文字?
- hibernate - 如何在 JPA 中初始化几层 LAZY 实体?
- python - 从网站获取 JSON 数据的不同方法
- vue.js - 登录后 VUA 和 AUTH0 未登陆上一个 URL