Python SQLalchemy无需创建模型

时间:2018-02-27 09:55:47

标签: 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)

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

some_data = Login_Data.query.limit(10)

但这感觉不必要,必须有更好的方法。如果已经定义了模型,重建模型的重点是什么。我在这里用什么:

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

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

2 个答案:

答案 0 :(得分:1)

您可能会对reflectionautomap感兴趣。

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

答案 1 :(得分:0)

感谢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, suppose it has two tables 'user' and 'address' set up
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)

完成此操作后,您现在可以使用所有已知的sqlalchemy功能:

some_data = db_session.query(LoginData).limit(10)