0

[Python3.x を使用] 基本的な考え方は、最初のクエリを実行して ID (テキスト) の長いリスト (約 100 万の ID) を取得し、それらの ID を別の WHERE ステートメントの IN() 句で使用する必要があるということです。クエリ。これを実現するために Python 文字列フォーマットを使用しています。ID の数が少ない場合 (たとえば 10 万個) はうまく機能しますがpyodbc.Error: ('08S01', '[08S01] [MySQL][ODBC 5.2(a) Driver][mysqld-5.5.31-MariaDB-log]MySQL server has gone away (2006) (SQLExecDirectW)')、セットが実際に約 100 万の ID の長さである場合はエラー () が表示されます。

私はそれを少し読み込もうとしましたが、SQLite によって設定されたデフォルト (?)の制限がある可能性があると思います。また、とにかく正しい方法でこれに取り組んでいるかどうか疑問に思っています。

これが私のコードです:

ステップ 1: ID の取得

def get_device_ids(con_str, query, tb_name):

    local_con = lite.connect('temp.db')
    local_cur = local_con.cursor()

    local_cur.execute("DROP TABLE IF EXISTS {};".format(tb_name))
    local_cur.execute("CREATE TABLE {} (id TEXT PRIMARY KEY, \
        lang TEXT, first_date DATETIME);".format(tb_name))

    data = create_external_con(con_str, query)

    device_id_set = set()

    with local_con:
        for row in data:
            device_id_set.update([row[0]])
            local_cur.execute("INSERT INTO srv(id, lang, \
                first_date) VALUES (?,?,?);", (row))
        lid = local_cur.lastrowid
        print("Number of rows inserted into SRV: {}".format(lid))

    return device_id_set

ステップ 2: 'dynamic' IN() 句を使用してクエリを生成する

def gen_queries(ids):
    ids_list = str(', '.join("'" + id_ +"'" for id_ in ids))

    query = """
    SELECT      e.id,
                e.field2,
                e.field3
    FROM        table e
    WHERE       e.id IN ({})
    """.format(ids_list)

    return query

ステップ 3: 別の INSERT クエリでそのクエリを使用する

これは物事がうまくいかないところです

def get_data(con_str, query, tb_name):

    local_con = lite.connect('temp.db')
    local_cur = local_con.cursor()

    local_cur.execute("DROP TABLE IF EXISTS {};".format(tb_name))
    local_cur.execute("CREATE TABLE {} (id TEXT, field1 INTEGER, \
        field2 TEXT, field3 TEXT, field4 INTEGER, \
        PRIMARY KEY(id, field1));".format(tb_name))

    data = create_external_con(con_str, query) # <== THIS IS WHERE THAT QUERY IS INSERTED

    device_id_set = set()

    with local_con:
        for row in data:
            device_id_set.update(row[1])
            local_cur.execute("INSERT INTO table2(id, field1, field2, field3, \
                field4) VALUES (?,?,?,?,?);", (row))
        lid = local_cur.lastrowid
        print("Number of rows inserted into table2: {}".format(lid))

どんな助けでも大歓迎です!

編集

これはおそらく私の問題に対する正しい解決策ですが、使用しようとする"SET SESSION max_allowed_packet=104857600"とエラーが発生します: SESSION variable 'max_allowed_packet' is read-only. Use SET GLOBAL to assign the value (1621). 次に、SESSION を GLOBAL に変更しようとすると、アクセス拒否メッセージが表示されます。

4

1 に答える 1