Python SQLalchemy 无需创建模型即可访问海量数据库数据

Rom*_*man 5 python sqlalchemy

我正在使用 Flaks python 和 sqlalchemy 连接到一个巨大的数据库,其中保存了很多统计信息。我需要使用这些统计数据创建一些有用的见解,因此我只需要读取/获取数据而无需修改。

我现在遇到的问题如下:

在访问表之前,我需要在模型文件中复制该表。例如,我Login_Data在数据库中看到该表。所以我进入我的模型并重新创建完全相同的表。

class Login_Data(Base):
    __tablename__ = 'login_data'
    id = Column(Integer, primary_key=True)
    date = Column(Date, nullable=False)
    new_users = Column(Integer, nullable=True)

    def __init__(self, date=None, new_users=None):
        self.date = date
        self.new_users = new_users

    def get(self, id):
        if self.id == id:
            return self
        else:
            return None

    def __repr__(self):
        return '<%s(%r, %r, %r)>' % (self.__class__.__name__, self.id, self.date, self.new_users)
Run Code Online (Sandbox Code Playgroud)

我这样做是因为否则我无法使用以下方式查询它:

some_data = Login_Data.query.limit(10)
Run Code Online (Sandbox Code Playgroud)

但这感觉没有必要,一定有更好的办法。如果模型已经定义了,那么重新创建模型还有什么意义呢?我在这里应该使用什么:

some_data = [SOMETHING HERE SO I DONT NEED TO RECREATE THE TABLE].query.limit(10)
Run Code Online (Sandbox Code Playgroud)

简单的问题,但我还没有找到解决方案。

Rom*_*man 9

感谢 Tryph 提供了正确的来源。

要使用 sqlalchemy 访问现有数据库的数据,您需要使用automap。在您加载/声明数据库类型的配置文件中。您需要使用automap_base(). 之后,您可以创建模型并使用数据库的正确表名称,而无需自己指定所有内容:

from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session
from sqlalchemy import create_engine
import stats_config

Base = automap_base()

engine = create_engine(stats_config.DB_URI, convert_unicode=True)

# reflect the tables
Base.prepare(engine, reflect=True)

# mapped classes are now created with names by default
# matching that of the table name.
LoginData = Base.classes.login_data

db_session = Session(engine)
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您现在可以在以下位置使用所有已知的 sqlalchemy 函数:

some_data = db_session.query(LoginData).limit(10)
Run Code Online (Sandbox Code Playgroud)


Try*_*yph 6

您可能对Reflectionautomap感兴趣。

不幸的是,由于我从未使用过这些功能,因此我无法告诉您更多有关它们的信息。我只知道它们允许使用数据库模式,而无需在 Python 中显式声明它。