2017-03-05 10 views
1

タイトルには、PythonとMySQLに関するいくつかの助けが必要です。私は現在Pythonをさらに研究しており、データベース設計、開発、管理、アプリケーションにPythonとMySQLを使用することに熱心に取り組んでいます。私はPythonのmysqlデータベースオブジェクトの使用に関するアドバイスが必要です

私はMySQLに精通していて、Pythonにはなじみがあります。現在、私はオブジェクト指向プログラミングに取り組んでおり、データベースクラス内でデータベース接続を設定し、そのクラスを使用してデータの作成、更新、削除、および読み込みを行っています。私が知りたい

import pymysql as MySQL 

class Database(object): 
    Host = "127.0.0.1" 
    Database = "****" 
    user = "****" 
    password = "****" 

@staticmethod 
def initialize(): 
    currentdb = MySQL.connect(Database.Host, Database.user, Database.password, Database.Database) 
    cursor = currentdb.cursor() 

@staticmethod 
def insert(Table, DataDict): 
    placeholders = ", ".join(["%s"] * len(DataDict)) 
    columns = ", ".join(DataDict.keys()) 
    sql = "INSERT INTO %s (%s) VALUES (%s)"%(Table, columns, placeholders) 
    cursor.execute(sql, DataDict.values()) 

、どのように私は、オブジェクトの内側にカーソルで動作します:

私は新しいPythonオブジェクトを作成していますか?私の現在のアプローチが、どのように処理すべきかにも近いのかどうかは分かりません。本当にわかりません。

上記のようにカーソルを初期化してから、上記の抽出で意図したとおりにオブジェクトでさらに使用できますか?

ご協力いただければ幸いです。

+0

あなたのdefsが 'Database'クラスの一部として字下げされ、' self'を継承するべきではありませんか? –

+0

初期化と挿入の2つのメソッドをクラス内で定義する必要があります。現在、クラス外にあり、insertメソッドは、initializeメソッドで作成したカーソルオブジェクトを参照できません。あなたが問題を見ることができるように私はしばらくのうちに回答を掲示します。 –

+0

注: '@ staticmethod'を複数回(通常は一度でも)使用していると思う場合は、自分のアーキテクチャについてもっと考える必要があります。完全なクラスであれば、クラスの外にあるプレーン関数です。 – 9000

答えて

0

カーソルで働くための正しい方法は、このようなものです:

import contextlib 

def doSomething(): 
    with contextlib.closing(database.cursor()) as cursor: 
    cursor.execute(...) 
    # At the end of the `with` statement, cursor is closed 

長すぎるためのオープンカーソルを保管しないでください。長い間接続を開いたままにしておくと、うまくいきます。また、トランザクション制御を読んでください。

DB操作のほんの一部以上を行っている場合は、SQLAlchemyまたはPony ORMのようなライブラリの使用を検討してください。

+0

ありがとうございます。接続を開いたままにしたり、プール(.NET 4ハーフオープンコネクタの場合は誰でもかまいません)のときに何が起こるのかよく知っています。 そして、あなたのアプローチは好きです。私はこのルートも試みます。これにより、オブジェクトは1回のパスで接続を作成、操作、閉じることができます。これは好きなことです。 私のPythonアプリケーションのほとんどは、ハードウェアとソフトウェアのために、私は接続を閉じてすぐに私がそれらをもう必要としなくなるとすぐにオフにすることに慣れています。だからこれは真剣な検討事項です。カーソルを始める方法を知っておく必要がありました。その後、私はそれを閉じることもできます:-) – OmagaIII

0
import contextlib 

def doSomething(): 
    with contextlib.closing(database.cursor()) as cursor: 
    cursor.execute(...) 

DB SQLAlchemyまたはPony ORMのライブラリ。

0

次のコードを確認してください。あなたがここにいるしたら

import pymysql as MySQL 

class Database(object): 

    def __init__(self, host, db, user, pw): 
     self.currentdb = MySQL.connect(Database.host, user, pw, db) 

    def insert(self, Table, DataDict): 
     placeholders = ", ".join(["%s"] * len(DataDict)) 
     columns = ", ".join(DataDict.keys()) 
     sql = "INSERT INTO %s (%s) VALUES (%s)"%(Table, columns, placeholders) 

     with self.currentdb.cursor() as db_cursor: 
     db_cursor.execute(sql, DataDict.values()) 

、その後、あなたはなどのデータベースオブジェクトを初期化することができます:私は、Pythonの標準クラスのinit方法にあなたの初期化()にコンテンツを追加し、パラメータの異なる種類で初期化されたデータベースを作りましたデータを挿入してください:

my_db = Database(host="127.0.0.1", user="****", pw="****", db="****") 
my_db.insert('table_name', data_dict) 

私はあなたのコードを変更していませんが、あなたのコードは変更されていません。

+0

ありがとう。高く評価します。 あなたがそれを構造化する方法は、私の心が私にしなければならないと言っていることです。それが私が混乱した理由です。 私はMySQLの代わりにMongoDBを使用するコースをやっています。だから彼らの方法に従うのではなく、私はコースをしながら飛行機でそれを変更しました。モンゴーはこのように初期化することができますが、それは少しでも感じられていました。 教師が通常の__init__を行い、関数を定義したくない理由はありません。はい、一定の値が必要です。しかし、定数が必要な場合は、可変接続情報を渡さないでください。ああ、このように私はもっとハハハを学ぶ – OmagaIII

+0

それはあなたのために役立ったことをうれしい。 –

0

SQLAlchemyとお考えですか?これにより、PythonクラスとMySQL(または他のRDBMS)テーブル間のマッピングが得られます。私は最近、かなり大規模な現実世界のプロジェクトでそれを使っています。それはかなりうまくやっているように見え、学ぶのは簡単です。

+0

私はそれについて聞いたことがありますが、試していません。私はもう少しこれをフォローアップするつもりです。ありがとう。 – OmagaIII

関連する問題