Python SQLAlchemy-将动态表名传递给查询函数?

Python SQLAlchemy-将动态表名传递给查询函数?,python,sqlalchemy,Python,Sqlalchemy,我有一个简单的轮询脚本,它根据MSSQL表中的新ID轮询条目。我正在使用SQLAlchemy的ORM创建一个表类,然后查询该表。我希望能够“动态”添加更多表,而无需将其直接编码到方法中 我的轮询功能: def poll_db(): query = db.query( Transactions.ID).order_by(Transactions.ID.desc()).limit(1) # Continually poll for new images to cla

我有一个简单的轮询脚本,它根据MSSQL表中的新ID轮询条目。我正在使用
SQLAlchemy
的ORM创建一个表类,然后查询该表。我希望能够“动态”添加更多表,而无需将其直接编码到方法中

我的轮询功能:

def poll_db():
    query = db.query(
        Transactions.ID).order_by(Transactions.ID.desc()).limit(1)

    # Continually poll for new images to classify
    max_id_query = query

    last_max_id = max_id_query.scalar()
    
    while True:

        max_id = max_id_query.scalar()
        if max_id > last_max_id:
            print(
                f"New row(s) found. "
                f"Processing ids {last_max_id + 1} through {max_id}"
            )
            # Insert ML model
            id_query = db.query(Transactions).filter(
                Transactions.ID > last_max_id)

            df_from_query = pd.read_sql_query(
                id_query.statement, db.bind, index_col='ID')

            print(f"New query was made")

            last_max_id = max_id
        time.sleep(5)
我的桌子型号:

import sqlalchemy as db
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import defer, relationship, query

from database import SessionLocal, engine

insp = db.inspect(engine)
db_list = insp.get_schema_names()

Base = declarative_base(cls=BaseModel)

class Transactions(Base):
    __tablename__ = 'simulation_data'
    sender_account = db.Column('sender_account', db.BigInteger)
    recipient_account = db.Column('recipient_account', db.String)
    sender_name = db.Column('sender_name', db.String)
    recipient_name = db.Column('recipient_name', db.String)
    date = db.Column('date', db.DateTime)
    text = db.Column('text', db.String)
    amount = db.Column('amount', db.Float)
    currency = db.Column('currency', db.String)
    transaction_type = db.Column('transaction_type', db.String)
    fraud = db.Column('fraud', db.BigInteger)
    swift_bic = db.Column('swift_bic', db.String)
    recipient_country = db.Column('recipient_country', db.String)
    internal_external = db.Column('internal_external', db.String)
    ID = Column('ID', db.BigInteger, primary_key=True)
问题

如何“动态”传递表类名,例如
poll\u db(tablename)
,其中
tablename='Transactions'
,而不是为多个表编写类似的查询,例如:

query = db.query(Transactions.ID).order_by(Transactions.ID.desc()).limit(1)       


query2 = db.query(Transactions2.ID).order_by(Transactions2.ID.desc()).limit(1)
        

query3 = db.query(Transactions3.ID).order_by(Transactions3.ID.desc()).limit(1)
        

这些表将具有相同的结构,但数据不同。

我现在无法给出完整的示例(稍后将进行编辑),但这里有一种简单的方法(文档可能是更好的检查方法):

def dynamic_表(tablename):
对于类\名称,cls在基。\ decl\类\注册表中。项()
如果cls.\uuuu tablename\uuuuu==tablename:
返回cls
Transactions2=动态表格(“模拟数据”)
断言事务2是事务
返回的类就是您想要的模型。请记住,
Base
只能访问已经子类化的表,因此,如果在其他模块中有这些表,则需要首先导入它们,以便将它们注册为
Base
的子类

对于选择列,类似这样的操作应该可以起作用:

def dynamic_table_与_列(tablename,*列):
cls=动态表格(表格名称)
子集=[]
对于列中的列名称:
column=getattr(cls,col\u name)
如果列:
subset.append(列)
#在没有列的情况下
如果不是子集:
返回db.query(cls)
返回db.query(*子集)

谢谢-我将尝试将其应用于我当前的工作。如果有效,我将接受答案:-)刚刚注意到您编辑了答案。如果您只想获得一些列,那么您可以更改
动态表的签名。我将在中编辑它