如何从 SQLAlchemy ORM 会话中查询预先存在的表?

Posted

技术标签:

【中文标题】如何从 SQLAlchemy ORM 会话中查询预先存在的表?【英文标题】:How to query pre-existing table from SQlAlchemy ORM session? 【发布时间】:2016-12-05 04:10:02 【问题描述】:

我正在使用 SQLAlchemy 进行一些数据处理并创建一些表。我正在从使用Declarative BaseORMTable 定义的表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 仅从连接表中选择列

加载关系时如何指示SQLAlchemy ORM并行执行多个查询?

SQLAlchemy ORM如何将查询与表连接起来

tornado 07 数据库—ORM—SQLAlchemy—查询

如何将特定的 SQL 语句实现为 SQLAlchemy ORM 查询