使用 sqlalchemy 的几个表的通用数据库函数

Generic database functions for serveral tables with sqlalchemy

我有一个基础 table 和多个 table 供教授、学生...使用来自 sqlalchemy 的 single table inheritance

from sqlalchemy import create_engine
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

base = declarative_base()


class TableBase(base):
    __tablename__ = 'base_table'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String)


class Student(TableBase):
    __tablename__ = 'student_table'
    id = Column(Integer, ForeignKey(TableBase.id), primary_key=True)

    __mapper_args__ = {
        'polymorphic_identity': 'student_table'
    }


class Professor(TableBase):
    __tablename__ = 'professor_table'
    id = Column(Integer, ForeignKey(TableBase.id), primary_key=True)

    __mapper_args__ = {
        'polymorphic_identity': 'professor_table'
    }


class Database:
    def __init__(self):
         db_string = "postgresql+psycopg2://user:secret@localhost:5432/<database>"
         engine = create_engine(db_string)

         Session = sessionmaker(engine)
         self.session = Session()
         base.metadata.create_all(engine)

    def add_entry(self, data, table):
        table_entry = self.create_table_entry(data, table)
        self.session.add(table_entry)
        self.session.commit()

    def add_entries(self, data_list, table):

        entries = []
        for data in data_list:
            table_entry = self.create_table_entry(data, table.__class__.__name__)
            entries.append(table_entry)

        self.session.add_all(entries)
        self.session.commit()


    def create_table_entry(self, data, table):
        table_entry = table(
            id=data["id"],
            subject=data["subject"],
            email=data["email"]
        )
        return table_entry


def main():
    student_table = Student()
    professor_table = Professor()


    db = Database()
    data = {"id": 42, "name": "John", "email": ""}
    db.create_table_entry(data, student_table)
    db.create_table_entry(data, professor_table)



if __name__ == "__main__":
    main()

但我不知道如何使用不同的对象创建 create_table_entry 函数 类。

最佳实践方法是什么?

def create_table_entry(data, table):
    return table(**data)

那你还需要单独的函数吗?

您可以像这样使用 sqlalchemy 插入命令:

from sqlalchemy import insert
def add_row(data, table):
    self.session.execute(insert(table), data)
    self.session.commit()