SQL 질문입니다. 많은 테이블에 같은 쿼리를 자동으로 돌리고 싶습니다.

조회수 334회

SELECT * FROM '테이블이름' ORDER BY '칼럼명' DESC Limit 30

위와 같은 쿼리를 테이블 수 만큼 돌리고 싶으며 테이블이 300개 가량 있습니다.

1/ PD 테이블에는 NameData의 테이블이름들이 들어있습니다. SELECT * FROM '테이블이름' ORDER BY High DESC Limit 30 에서 테이블 이름을 PD테이블에 있는 이름데이터를 하나씩 받아와서 Keys 테이블들을 정렬하고 싶습니다.

2/ 1번이 불가능하다면 '테이블이름' 을 하나로 정하지 않고 Keys 데이터베이스 안에 테이블들을 전부 정렬할 수 있으면 좋겠습니다.

import sqlite3

con = sqlite3.connect("PD.db")
con1 = sqlite3.connect("Keys.db")
with con1:
    cur = con1.cursor()
    array1 = "SELECT * from NameData"    #PD안에 있는 Keys 테이블명들 입니다.
    rows = cur.execute(array1)


    for row in rows:
        array = "SELECT * FROM '테이블이름' ORDER BY '칼럼명' DESC Limit 30"
        print(row)         
        rows = cur.execute(array)



3/ 실행하면 PD 따로 Keys 따로 나오며 '테이블이름' 안에 arrary1을 적어도 arrary1이라는 테이블은 없다고만 나옵니다. 쿼리에는 변수가 들어가지 않나요?

DB Browser for SQLite 사용중입니다.

2 답변

  • 좋아요

    0

    싫어요
    채택 취소하기
    • 파이썬을 통해 SQLite 쿼리를 실행하고 있는 것이기 때문에, (SQLite) 쿼리에는 (파이썬) 변수가 들어갈 수 있습니다.
    • 그나저나 con1은 사용을 하는데 con은 사용을 안하고 계시군요.

    아마 이런 전개가 되어야 하겠죠. 테스트 안해본 코드이니 참고만 해주세요.

    con = sqlite3.connect("PD.db")
    con1 = sqlite3.connect("Keys.db")
    
    con1tableNames = []
    with con:
        cur = con.cursor()
        rows = cur.execute("SELECT tableName from NameData")
        for row in rows:
            con1tableNames.append(row['tableName'])
    print(con1tableNames)
    
    con1Results = []
    with con1:
        for con1tableName in con1tableNames:
            cur = con1.cursor()
            # 이렇게 문자열 + 변수 + 문자열 = 문자열 만드는 과정을 '보간'이라고 함
            rows = cur.execute("SELECT * FROM " + con1tableName + " ORDER BY col1 DESC LIMIT 30")
            for row in rows:
                con1Results.append(row)
    print(con1Results)
    
    • 감사합니다. 이틀동안 고통받고 있었는데 겨우 실마리가 보이네요. 감사합니다 선생님 마창현 2022.5.13 16:50
  • rows = cur1.execute( "SELECT * FROM "  "[f'{con1tableName}']"  "ORDER BY ...")   #TypeError: can only concatenate str (not "list") to str
                        #"SELECT * FROM "   f'{con1tableName}' "ORDER BY...``"   =  qlite3.OperationalError: near"/" : synyax error
                        #"SELECT * FROM "  "[f'{con1tableName}']" "ORDER BY... ``"    = 테이블 이름중에 f'{con1tableName}' 이 없다고 나옵니다.
                        #"SELECT * FROM "  "[BTC/USDT]" "ORDER BY...``"     =  원하는 값이  나옵니다.
    
    
    • +con1tableName+ 을 f 스트링으로 바꿔서 진행하니 알아듣더군요. 감사합니다.
    • " [ ] " 형식으로 만들어야지 인식을 하는것 으로 보입니다.
    • execute( ) 안에 큰따옴표가 붙게되면 f 스트링을 변수로 인식을 못하는걸로 보입니다.
    • 큰따옴표가 없으면 rows 가 실행이 안되더군요.
    • "[f'{con1tableName}']" 이게 아니라면 어떤 방법이 있는지 궁금합니다.
    • 이건 파이썬 문법이나 SQLite에 관한 다른 질문 같네요. 내용 정리하셔서 새 질문으로 올리시면 다른 분들이 봐주실 수도 있겠지요. 엽토군 2022.5.14 09:53
    • 네 감사합니다. 큰 도움이 되었습니다. 마창현 2022.5.14 21:59
    • 테이블명에 들어간 특수문자가 문제 nowp 2022.5.16 08:01

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)