首页 > 解决方案 > 自动加载表上的所有 SQLAlchemy 查询是否在导入后运行?

问题描述

我正在自动加载数据库表SQLAlchemy

# src/database/tables.py
from setup import engine
from sqlalchemy import Table
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base(engine)

class Address(Base):
    __table__ = Table('addresses', Base.metadata,
                      autoload=True, autoload_with=engine)
class Doctor(Base):
    __table__ = Table('doctors', Base.metadata,
                      autoload=True, autoload_with=engine)

我有导入这些表类的查询文件,我尝试创建稍后将在我的主run.py脚本中使用的所有查询:

# src/queries/addresses.py
from src.database.tables import Address, Doctor
from setup import session

join = (
    session.query(Address)
    .join(Doctor, Doctor.DoctorID == Address.ClientID)
)
...

# lots of additional declared queries

我有一个run.py导入查询并从中创建熊猫数据框。

# run.py
import setup as stp
print('Prints instantly')
from src.queries import doctors, addresses
print('This prints only after a lot of time')
from src.methods import pandas_helper as pdh
import matplotlib.pyplot as plt

# creating dataframes from certain queries and plot them

每次我在所有导入后运行一次run.pyprint('test')执行时间都会变得很长。我已经print()在查询文件的导入周围添加了其他功能,以确保该过程需要花费大量时间。

我认为原因一定是从头开始自动加载数据库表,或者是我在使用这些表的查询文件中声明的大量查询。

我不确定查询何时实际运行。我猜是在声明之后,所以当我导入所有文件时,我的所有查询都会立即被调用?

有没有办法只创建所有这些查询和表自动加载并仅在我想使用需要这些资源的特定查询变量时运行它们?

标签: pythonsqlsqlalchemy

解决方案


有点看不到树木的情况。是的,声明的查询变量都是在导入时创建的。

只需将所有查询变量放入函数即可解决问题。您必须在需要时调用该函数,而不是导入大量查询变量。

# src/queries/addresses.py
from src.database.tables import Address, Doctor
from setup import session

def join(): 
    return (
        session.query(Address)
        .join(Doctor, Doctor.DoctorID == Address.ClientID)
    )

更像是我脑海中的一个基本 Python 问题,但同样具有启发性。


推荐阅读