我使用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)
简单的问题,但我还没有找到解决方案。
答案 0 :(得分:1)
您可能会对reflection和automap感兴趣。
不幸的是,由于我从未使用过任何这些功能,因此我无法告诉您更多有关它们的信息。我只知道他们允许使用数据库模式而无需在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)