我正在使用 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)
简单的问题,但我还没有找到解决方案。
感谢 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)
不幸的是,由于我从未使用过这些功能,因此我无法告诉您更多有关它们的信息。我只知道它们允许使用数据库模式,而无需在 Python 中显式声明它。
| 归档时间: |
|
| 查看次数: |
6056 次 |
| 最近记录: |