【问题标题】:Simple SELECT statement on existing table with SQLAlchemy使用 SQLAlchemy 对现有表执行简单的 SELECT 语句
【发布时间】:2022-05-09 02:39:35
【问题描述】:

互联网上没有关于 SQLAlchemy 1.0 的简单 SELECT 语句的简单几行教程。

假设我已经使用create_engine() 建立了我的数据库连接,并且我的数据库表已经存在,我想知道如何执行以下查询:

select
    name,
    age
from
    users
where
    name = 'joe'
    and
    age = 100

【问题讨论】:

    标签: python mysql select sqlalchemy


    【解决方案1】:

    在试图弄清楚同样的事情时发现了这个。

    要通过 SQLAlchemy 从表中选择数据,您需要在 SQLAlchemy 中构建该表的表示。如果 Jupyter Notebook 的响应速度有任何指示,则在执行查询之前不会填充该表示(使用现有数据库中的数据)。

    您需要Table 来构建表格。您需要select 从数据库中选择数据。您需要 metadata... 的原因尚不清楚,即使在 the docs 中也是如此。

    from sqlalchemy import create_engine, select, MetaData, Table, and_
    
    engine = create_engine("dburl://user:pass@database/schema")
    metadata = MetaData(bind=None)
    table = Table(
        'table_name', 
        metadata, 
        autoload=True, 
        autoload_with=engine
    )
    
    stmt = select([
        table.columns.column1,
        table.columns.column2
    ]).where(and_(
        table.columns.column1 == 'filter1',
        table.columns.column2 == 'filter2'
    ))
    
    connection = engine.connect()
    results = connection.execute(stmt).fetchall()
    

    然后您可以迭代结果。请参阅SQLAlchemy query to return only n results?,了解如何返回一行或仅几行数据,这对于较慢/较大的查询很有用。

    for result in results:
        print(result)
    

    我用本地数据库检查了这个,SQLAlchemy 结果不等于原始 SQL 结果。对于我的数据集,不同之处在于数字的格式。 SQL返回float64(例如633.07),而SQLAlchemy返回对象(我认为Decimal,例如633.0700000000。)

    来自DataCamp's Introduction to Databases in Python的一些帮助

    【讨论】:

    • Pandas 通过 read_sql 原生支持这一点
    【解决方案2】:

    由于原始问题在 select 语句中有两列,因此可能会使一些人混淆如何使用它来编写:

    from sqlalchemy import and_  
    stmt = select([users.columns.name,users.columns.age])  
    stmt= stmt.where(and_(name=='joe',age==100)  
    for res in connection.execute(stmt):  
        print(res)
    

    【讨论】:

    • 不错;我将其合并到我上面的答案中。谢谢!
    【解决方案3】:

    我认为以下内容将适用于查询用户数据库表

    from sqlalchemy.sql import and_
    s = select([users]).where(and_(users.c.name == 'joe', users.c.age == 100))
    for row in conn.execute(s):
        print row
    

    http://docs.sqlalchemy.org/en/latest/core/tutorial.html

    【讨论】:

    • 你是如何声明引擎、数据库、连接、会话和导入语句的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多