如何从 SQLAlchemy ORM 会话中查询预先存在的表?
Posted
技术标签:
【中文标题】如何从 SQLAlchemy ORM 会话中查询预先存在的表?【英文标题】:How to query pre-existing table from SQlAlchemy ORM session? 【发布时间】:2016-12-05 04:10:02 【问题描述】:我正在使用 SQLAlchemy 进行一些数据处理并创建一些表。我正在从使用Declarative Base
类ORMTable
定义的表orm_table
中加载数据,因此可以使用session.query(ORMTable).all()
语句查询数据库。
但是,我还需要查询另一个表non_orm_table
,该表已经存在于数据库中,并且没有在orm中定义。如何从同一会话中查询此表?我没有与之相关的课程,所以想知道这种情况的标准做法是什么?
【问题讨论】:
您能为预先存在的表定义一个模型吗? 如果需要,我可以。但是表格已经存在,所以我希望有一种方法可以将我感兴趣的特定表格的信息提取到 ORM 可以使用的内容中。 看看 sqlalchemy.ext.automap。 :-) 【参考方案1】:这是制作它的代码sn-p:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
engine = create_engine('<db_connection_string>', echo=True)
Base = declarative_base(engine)
class NonOrmTable(Base):
"""
eg. fields: id, title
"""
__tablename__ = 'non_orm_table'
__table_args__ = 'autoload': True
def loadSession():
""""""
metadata = Base.metadata
Session = sessionmaker(bind=engine)
session = Session()
return session
if __name__ == "__main__":
session = loadSession()
res = session.query(NonOrmTable).all()
print res[1].title
关键是使用SqlAlchemy’s autoload
属性。它将现有的表字段名称动态映射到类。
希望对你有帮助。
【讨论】:
还必须在 table_args 中使用autoload_with
但这确实有帮助。正是我想要的。谢谢 !我接受了你的回答。
是的,您仍然需要将类与现有表绑定。【参考方案2】:
你也可以这样做。
#Considering account is your table and first_name is a column
from sqlalchemy import create_engine, select, MetaData, Table
CONN = create_engine('postgresql+psycopg2://username:password@localhost:5432/dbname',
client_encoding="UTF-8")
META_DATA = MetaData(bind=CONN, reflect=True)
account = META_DATA.tables['account']
stmt = select([account]).where(account.columns.first_name == 'Michael')
connection = CONN.connect()
results = connection.execute(stmt).fetchall()
# to print the result
for result in results:
print(result)
【讨论】:
以上是关于如何从 SQLAlchemy ORM 会话中查询预先存在的表?的主要内容,如果未能解决你的问题,请参考以下文章
这是从 Twisted 进行线程化 SQLAlchemy 查询的可接受方式吗?
加载关系时如何指示SQLAlchemy ORM并行执行多个查询?