簡體   English   中英

在 SQLAlchemy/Elixir 中選擇不同的列值

[英]Selecting distinct column values in SQLAlchemy/Elixir

在我使用 SQLAlchemy 和 Elixir 編寫的一個小腳本中,我需要獲取特定列的所有不同值。 在普通的 SQL 中,這很簡單

SELECT DISTINCT `column` FROM `table`;

而且我知道我可以“手動”運行該查詢,但如果可以的話,我寧願堅持使用 SQLAlchemy 聲明性語法(和/或 Elixir)。 我確信這一定是可能的,我什至在 SQLAlchemy 文檔中看到了對這類事情的暗示,但我已經在該文檔中尋找了幾個小時(以及 Elixir 的文檔),我就是不能似乎實際上弄清楚了如何完成。 那么我錯過了什么?

您可以查詢映射類的列屬性,並且 Query 類有一個生成的distinct()方法:

for value in Session.query(Table.column).distinct():
     pass

對於這個類:

class Assurance(db.Model):
    name = Column(String)

你可以這樣做:

assurances = []
for assurance in Assurance.query.distinct(Assurance.name):
    assurances.append(assurance.name)

你將擁有不同值的列表

for user in session.query(users_table).distinct():
    print user.posting_id

我想計算不同的值,使用.distinct().count()會先計算,得到一個值,然后做不同的。 我必須執行以下操作

from sqlalchemy.sql import func
Session.query(func.count(func.distinct(Table.column))

上課,

class User(Base):
    name Column(Text),
    id Column(Integer, primary_key=True)

方法 1:使用 load_only

from sqlalchemy.orm import load_only
records= (db_session.query(User).options(load_only(name)).distinct().all())
values = [record[0] if len(record) == 1 else record for record in records] #list of distinct values

方法2:沒有任何導入

records = db_session.query(User.name).distinct().all()
l_values = [record.__dict__[l_columns[0]] for record in records]

SQL Alchemy 版本 2 鼓勵使用select() function。 您可以使用 SQL Alchemy table來構建提取唯一值的 select 語句:

select(distinct(table.c.column_name))

SQL Alchemy 2.0 遷移 ORM 用法

"The biggest visible change in SQLAlchemy 2.0 is the use of Session.execute() in conjunction with select() to run ORM queries, instead of using Session.query()."

使用 pandas 收集唯一值的可重現示例。

定義並插入 iris 數據集

為 iris 數據集定義一個 ORM 結構,然后使用 pandas 將數據插入到 SQLite 數據庫中。 Pandas 插入帶有if_exists="append"參數,以便它保留 SQL Alchemy 中定義的結構。

import seaborn
import pandas
from sqlalchemy import create_engine
from sqlalchemy import MetaData, Table, Column, Text, Float
from sqlalchemy.orm import Session

定義元數據並創建表

engine = create_engine('sqlite://')
meta = MetaData()
meta.bind = engine
iris_table = Table('iris',
                   meta,
                   Column("sepal_length", Float),
                   Column("sepal_width", Float),
                   Column("petal_length", Float),
                   Column("petal_width", Float),
                   Column("species", Text))
iris_table.create()

將數據加載到表中

iris = seaborn.load_dataset("iris")
iris.to_sql(name="iris",
            con=engine,
            if_exists="append",
            index=False,
            chunksize=10 ** 6,
            )

Select 唯一值

重新使用上面的iris_table

from sqlalchemy import distinct, select
stmt = select(distinct(iris_table.c.species))
df = pandas.read_sql_query(stmt, engine)
df
#       species
# 0      setosa
# 1  versicolor
# 2   virginica

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM