テーブルを抽出する3つのクエリがあります(以下のスクリプトを参照)。私はデータベース内の3つの元のクエリ(メモリ内のみ)からテーブルを保存することなく、新しいテーブルにこれらのテーブルを結合したいと思います。それは可能ですか?メモリ内のSQLテーブルを結合する
私は2つの理由でこれを行うにはしたいと思います:
私は
CREATE TABLE my_table SELECT ..
がconnection.commit()
と、サーバー上のテーブルを保存するために仕事を得ることができないなどそれは、より効率的ですこれらのテーブルはかなり大きく、リモートデータベースに格納する必要はありません(ローカルでのみ、ピクルファイルを使用して毎日バックアップを行っています)。
コード
from mysql.connector import connect as sql_connect
import cPickle as pickle
def extract_values_with_columns(cursor, query, multi=False, verbose=False):
cursor.execute(query, multi=multi)
results = list(cursor.fetchall())
field_names = [i[0] for i in cursor.description]
if verbose:
print("Variables: {}".format(field_names), end=" ")
results.insert(0, field_names)
return results
def save(dset_name, results):
with open("{}.pickle".format(dset_name), mode='w') as f:
f.write(pickle.dumps(results))
if __name__ == '__main__':
connection = sql_connect(user=SSH_USERNAME, password=DATABASE_PASSWORD,
host='127.0.0.1', port=tunnel.local_bind_port,
database=DATABASE_NAME)
print("Connection successful!")
cursor = connection.cursor() # get the cursor
cursor.execute("USE {}".format(DATABASE_NAME)) # select the database
# combine ratings and tweet text
query = "SELECT rt.tweet_id, rt.rating_id, rt.tweet_text, \
{} \
FROM contribute_ratedtweet rt \
INNER JOIN contribute_rating ra ON rt.rating_id=ra.id".format(emotion_factors)
results = extract_values_with_columns(cursor, query)
save('agg_tweets_with_ratings', results)
# combine profiles with demographics and technical data
# joins should be done on the original variable name, not the renamed one
demo_vars = "demo.gender, demo.age, demo.ethnicity, demo.education, demo.language, demo.done"
tech_vars = "tech.entry_point, tech.ip_addr, tech.user_agent, tech.mobile, tech.referrer, tech.time_taken, tech.usage, tech.sharing_consent, tech.time_started"
query = "SELECT pro.username, pro.random_seed, \
demo.id AS demographic_id, {}, \
tech.id AS technical_data_id, {} \
FROM contribute_profile pro \
INNER JOIN contribute_demographic demo ON pro.demographic_id=demo.id \
INNER JOIN contribute_technicaldata tech ON pro.technical_data_id=tech.id".format(demo_vars, tech_vars)
results = extract_values_with_columns(cursor, query)
save('agg_profiles_with_info', results)
# add userID and tweet ID for convenience to rated tweets
query = "SELECT pro_rt.profile_id, pro_rt.ratedtweet_id, pro.username, rt.tweet_id \
FROM contribute_profile_rated_tweets pro_rt \
INNER JOIN contribute_profile pro ON pro_rt.profile_id=pro.id \
INNER JOIN contribute_ratedtweet rt ON pro_rt.ratedtweet_id=rt.id"
results = extract_values_with_columns(cursor, query)
save('agg_ratings_with_info', results)
好奇心で、なぜあなたは#1を実行できませんか?エラーは何ですか?または遅すぎますか?そしてあなたの必要性について説明しますが、現在のコードに何が間違っているかは言及しません。あなたはpicklesまたは1つの大きなpickleとしてクエリを保存しますか? – Parfait
エラーはありません。単に何も起こらない。テーブルは決してデータベースサーバには現れず、参照することもできません。 – pir
私は上記のコードを使用して、ピクルスとしてクエリを保存しています。私がしたいのは、これらの3つのクエリから得られた結果を結合して新しいテーブルを作成することです。しかし、私は結果をサーバー上ではなくローカルで取得するため、私はそれを行うことができません。私はどうにかして、私はそれらに参加することができるようにサーバー上でクエリの結果を保持する必要があります。おそらく、私の質問は十分にはっきりしていなかったかもしれません。 – pir