복붙노트

[SQL] SQLAlchemy의를 통해 임의의 행을 얻기

SQL

SQLAlchemy의를 통해 임의의 행을 얻기

어떻게 SQLAlchemy의를 사용하여 테이블에서 하나 개 이상의 임의의 행을 선택합니까?

해결법

  1. ==============================

    1.이것은 매우 많은 데이터베이스 관련 문제입니다.

    이것은 매우 많은 데이터베이스 관련 문제입니다.

    나는 당신이 SQLAlchemy의이 사용할 수 있도록 PostgreSQL을, SQLite는, MySQL은, 오라클은, 임의의 기능에 의해 질서있는 능력을 가지고 있음을 알고있다 :

    from  sqlalchemy.sql.expression import func, select
    
    select.order_by(func.random()) # for PostgreSQL, SQLite
    
    select.order_by(func.rand()) # for MySQL
    
    select.order_by('dbms_random.value') # For Oracle
    

    다음으로, 당신은 당신이 필요로하는 레코드의 수에 의해 쿼리 제한 할 필요가있다 (예를 들어으로 제한 할를 사용하여 ()).

    PostgreSQL을에서 적어도, 무작위 기록을 선택하면 심각한 성능 문제가 있음을 명심; 여기에 대한 좋은 기사입니다.

  2. ==============================

    2.당신이 ORM을 사용하고 테이블이 크지 않다 (또는 행의 양이 캐시가) 당신이 원하는 경우는 정말 간단한 방법은 데이터베이스 독립적이어야합니다.

    당신이 ORM을 사용하고 테이블이 크지 않다 (또는 행의 양이 캐시가) 당신이 원하는 경우는 정말 간단한 방법은 데이터베이스 독립적이어야합니다.

    import random
    rand = random.randrange(0, session.query(Table).count()) 
    row = session.query(Table)[rand]
    

    이것은 약간 부정 행위하지만 당신이 ORM을 사용하는 이유 이잖아된다.

  3. ==============================

    3.데이터베이스 독립적 인 임의의 행을 풀 수있는 간단한 방법이있다. 그냥 .offset ()를 사용합니다. 모든 행을 당길 필요가 없습니다 :

    데이터베이스 독립적 인 임의의 행을 풀 수있는 간단한 방법이있다. 그냥 .offset ()를 사용합니다. 모든 행을 당길 필요가 없습니다 :

    import random
    query = DBSession.query(Table)
    rowCount = int(query.count())
    randomRow = query.offset(int(rowCount*random.random())).first()
    

    테이블은 테이블 인 경우 (또는 당신이 어떤 쿼리를 둘 수 있었다). 당신은 몇 행을 원하는 경우에, 당신은 그냥이 여러 번 실행하고, 각 행은 이전과 동일하지 있는지 확인 할 수 있습니다.

  4. ==============================

    4.여기에 느린에서 가장 빠른에 주문 네 가지 변화가있다. 하단에 timeit 결과 :

    여기에 느린에서 가장 빠른에 주문 네 가지 변화가있다. 하단에 timeit 결과 :

    from sqlalchemy.sql import func
    from sqlalchemy.orm import load_only
    
    def simple_random():
        return random.choice(model_name.query.all())
    
    def load_only_random():
        return random.choice(model_name.query.options(load_only('id')).all())
    
    def order_by_random():
        return model_name.query.order_by(func.random()).first()
    
    def optimized_random():
        return model_name.query.options(load_only('id')).offset(
                func.floor(
                    func.random() *
                    db.session.query(func.count(model_name.id))
                )
            ).limit(1).all()
    

    300 행 PostgreSQL의 테이블에 대해 내 맥북에 10,000 실행을위한 timeit 결과 :

    simple_random(): 
        90.09954111799925
    load_only_random():
        65.94714171699889
    order_by_random():
        23.17819356000109
    optimized_random():
        19.87806927999918
    

    쉽게 () func.random를 사용하는 것이 훨씬 더 빠른 파이썬의 random.choice 모든 결과를 반환보다 것을 볼 수있다 ().

    주문 BY 인덱스를 사용할 수 있습니다) optimized_random에서 COUNT (대 전체 테이블 스캔을 필요로하기 때문에 또한, 테이블의 크기가 증가로, order_by_random의 성능 ()이 크게 저하됩니다.

  5. ==============================

    5.2003 TABLESAMPLE 절 : 일부 SQL DBMS, 즉 마이크로 소프트 SQL 서버, DB2 및 PostgreSQL은 SQL을 구현했습니다. 지원은 버전 1.1에서 SQLAlchemy의 추가되었습니다. 이것은 다른 샘플링 방법을 사용하여 테이블의 예를 반환 허용 - 표준 테이블의 원하는 비율을 대략 되돌아 SYSTEM과 베르누이 요구한다.

    2003 TABLESAMPLE 절 : 일부 SQL DBMS, 즉 마이크로 소프트 SQL 서버, DB2 및 PostgreSQL은 SQL을 구현했습니다. 지원은 버전 1.1에서 SQLAlchemy의 추가되었습니다. 이것은 다른 샘플링 방법을 사용하여 테이블의 예를 반환 허용 - 표준 테이블의 원하는 비율을 대략 되돌아 SYSTEM과 베르누이 요구한다.

    SQLAlchemy의 FromClause.tablesample () 및 TABLESAMPLE ()에서 TABLESAMPLE 구조체를 생성하는데 사용된다 :

    # Approx. 1%, using SYSTEM method
    sample1 = mytable.tablesample(1)
    
    # Approx. 1%, using BERNOULLI method
    sample2 = mytable.tablesample(func.bernoulli(1))
    

    매핑 된 클래스와 함께 사용 약간 잡았다가있다 : 생성 TABLESAMPLE 개체가 쿼리 모델 객체로 사용하기 위해 별명이 지정되어야합니다 :

    sample = aliased(MyModel, tablesample(MyModel, 1))
    res = session.query(sample).all()
    

    답변의 대부분은 성능 벤치 마크를 포함하기 때문에, 나뿐만 아니라 여기에 몇 가지 간단한 테스트를 포함 할 수 있습니다. 만 약 행과 단일 정수 열이있는 PostgreSQL의에서 간단한 테이블을 사용하여 (약.) 선택 1 % 샘플 :

    In [24]: %%timeit
        ...: foo.select().\
        ...:     order_by(func.random()).\
        ...:     limit(select([func.round(func.count() * 0.01)]).
        ...:           select_from(foo).
        ...:           as_scalar()).\
        ...:     execute().\
        ...:     fetchall()
        ...: 
    307 ms ± 5.72 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    In [25]: %timeit foo.tablesample(1).select().execute().fetchall()
    6.36 ms ± 188 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    In [26]: %timeit foo.tablesample(func.bernoulli(1)).select().execute().fetchall()
    19.8 ms ± 381 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    

    이 샘플 페이지가 아닌 개별 튜플, 그것은 예를 들어 작은 테이블에 적합하지 않을 수 있습니다, 테이블이 클러스터 된 경우, 임의 결과로 생성되지 않을 수도 있음을 알아야 사용 SYSTEM 샘플링 방법의 하나에 돌진하기 전에.

  6. ==============================

    6.이 솔루션 I의 사용이다 :

    이 솔루션 I의 사용이다 :

    from random import randint
    
    rows_query = session.query(Table)                # get all rows
    if rows_query.count() > 0:                       # make sure there's at least 1 row
        rand_index = randint(0,rows_query.count()-1) # get random index to rows 
        rand_row   = rows_query.all()[rand_index]    # use random index to get random row
    
  7. ==============================

    7.이 테이블의 임의의 행을 선택하는 내 기능입니다 :

    이 테이블의 임의의 행을 선택하는 내 기능입니다 :

    from sqlalchemy.sql.expression import func
    
    def random_find_rows(sample_num):
        if not sample_num:
            return []
    
        session = DBSession()
        return session.query(Table).order_by(func.random()).limit(sample_num).all()
    
  8. ==============================

    8.이 간단한 방법을 사용 데이터베이스에서 무작위로 질문을 선택하는 방법에 대한 예 : -

    이 간단한 방법을 사용 데이터베이스에서 무작위로 질문을 선택하는 방법에 대한 예 : -

    #first import the random module
    import random
    
    #then choose what ever Model you want inside random.choise() method
    get_questions = random.choice(Question.query.all())
    
  9. ==============================

    9.이 솔루션은이 아직없는 경우이어야한다, 기본 키가 ID 이름이 있어야합니다 :

    이 솔루션은이 아직없는 경우이어야한다, 기본 키가 ID 이름이 있어야합니다 :

    import random
    max_model_id = YourModel.query.order_by(YourModel.id.desc())[0].id
    random_id = random.randrange(0,max_model_id)
    random_row = YourModel.query.get(random_id)
    print random_row
    
  10. ==============================

    10.사용중인 데이터베이스에 따라 SQL을 통해 몇 가지 방법을 프로그래머.

    사용중인 데이터베이스에 따라 SQL을 통해 몇 가지 방법을 프로그래머.

    (내가 SQLAlchemy의 어쨌든 모든를 사용할 수 있다고 생각)

    한다 : mysql

    SELECT colum FROM table
    ORDER BY RAND()
    LIMIT 1
    

    PostgreSQL의 :

    SELECT column FROM table
    ORDER BY RANDOM()
    LIMIT 1
    

    MSSQL :

    SELECT TOP 1 column FROM table
    ORDER BY NEWID()
    

    IBM DB2 :

    SELECT column, RAND() as IDX
    FROM table
    ORDER BY IDX FETCH FIRST 1 ROWS ONLY
    

    신탁:

    SELECT column FROM
    (SELECT column FROM table
    ORDER BY dbms_random.value)
    WHERE rownum = 1
    

    그러나 나는 어떤 표준 방법을 알고하지 않습니다

  11. from https://stackoverflow.com/questions/60805/getting-random-row-through-sqlalchemy by cc-by-sa and MIT license