12

mysql で peewee を使用する方法を学ぼうとしています。

既存のテーブルを持つ mysql サーバー上に既存のデータベースがあります。テーブルは現在空です (現在テスト中です)。

>>> db = MySQLDatabase('nhl', user='root', passwd='blahblah')
>>> db.connect()


>>> class schedule(Model):
...     date = DateField()
...     team = CharField()
...     class Meta:
...             database = db

>>> test = schedule.select()
>>> test
<class '__main__.schedule'> SELECT t1.`id`, t1.`date`, t1.`team` FROM `nhl` AS t1 []
>>> test.get()

次のエラーが表示されます。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/peewee.py", line 1408, in get
    return clone.execute().next()
  File "/usr/lib/python2.6/site-packages/peewee.py", line 1437, in execute
    self._qr = QueryResultWrapper(self.model_class, self._execute(), query_meta)
  File "/usr/lib/python2.6/site-packages/peewee.py", line 1232, in _execute
    return self.database.execute_sql(sql, params, self.require_commit)
  File "/usr/lib/python2.6/site-packages/peewee.py", line 1602, in execute_sql
    res = cursor.execute(sql, params or ())
  File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py", line 201, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib64/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (1054, "Unknown column 't1.id' in 'field list'")

peewee が選択クエリに「id」列を追加するのはなぜですか? データベースに既に存在するテーブルに id 列がありません。私は単に既存のテーブルを操作したいだけで、データベースとやり取りするたびに peewee がテーブルを作成する必要はありません。ここが間違いだと思います。

テーブルが空であるため、クエリの結果は空になるはずですが、学習中なので、コードを試してみたかっただけです。私はあなたの助けに感謝します。

編集

Wooble と Francis からの有益な回答に基づいて、peewee や sqlalchemy のような別の ORM を使用することが理にかなっているのかどうか疑問に思うようになりました。MySQLdb を使用して Python で直接クエリを実行する代わりに、ORM を使用する利点は何ですか?

これは私がやろうとしていることです:

-さまざまな Web サーバーからデータを自動的にダウンロードします。ほとんどのデータは xls または csv 形式です。xlrd パッケージを使用して xls を csv に変換できます。

-mysql db テーブルに挿入/一括挿入する前に、リスト オブジェクト内のデータを解析/処理します。

-複雑なクエリを実行して、mysql から python にデータを適切な構造化データ (リストなど) にエクスポートし、mysql ではなく python で実行する方が簡単なさまざまな統計計算を行います。mysql で実行できることはすべてそこで実行されますが、python で複雑な回帰を実行する場合があります。

-クエリから取得したデータに対してさまざまなグラフィカル パッケージを実行します。これには、高度なグラフィカル パッケージである ggplot2 パッケージ (R プロジェクトから) の使用が含まれる場合があります。そこで、R/Python の統合をいくつか行います。

上記を考えると、ORM/Peewee/SQLAlchemy を学ぶためにハッキングに時間を費やすか、MySQLdb を使用して直接 mysql クエリに固執するのが最善ですか?

4

4 に答える 4

16

ほとんどの単純なアクティブ レコード パターン ORMには、idオブジェクト ID を追跡するための列が必要です。PeeWee はその 1 つであるようです (または、少なくともID を使用しない方法を知りません)。テーブルを変更せずに PeeWee を使用することはおそらくできません。

キーまたは複合キーがないように見えるため、既存のテーブルはとにかくうまく設計されていないようです。すべてのテーブルにはキー属性が必要です。そうしないと、ある行を別の行と区別することができなくなります。

これらの列のいずれかが主キーである場合は、非整数の主キーに関するドキュメントでprimary_key=True説明されているように引数を追加してみてください

date = DateField(primary_key=True)

主キーの名前が でない場合id、テーブルの実際の主キーを、そのテーブルの peewee モデルで「PrimaryKeyField()」のタイプに設定する必要があります。

データマッパーパターンを使用するSQLAlchemyを調査する必要があります。はるかに複雑ですが、はるかに強力です。SQL テーブルの設計に制限はありません。実際、ほとんどの場合、テーブル構造と相互関係を自動的に反映できます。(デフォルトのテーブル エンジンでは外部キー関係が表示されないため、MySQL ではそうではないかもしれません。) 最も重要なのは、キーのないテーブルを処理できることです。

于 2013-03-22T00:04:14.353 に答える
10

主キーの列名が「id」以外の場合は、そのテーブル モデル クラスにフィールドを追加する必要があります。

class Table(BaseModel):
    id_field = PrimaryKeyField()

これにより、テーブルの主キーが「id_field」という名前の列に格納されており、その列が自動インクリメントが有効になっている INT タイプであることをスクリプトに伝えます。 これは、 peeweeのフィールド タイプを説明するドキュメントです。

フランシス・アビラがすでに指摘しているように、主キーフィールドをさらに制御したい場合は、フィールドを作成するときに primary_key=True 引数を使用する必要があります。

class Table(BaseModel):
    id_field = CharField(primary_key=True)

非整数主キーのドキュメントに関するこのリンクを参照してください。

于 2013-04-17T15:56:08.420 に答える
3

このモデルには primary_key フィールドを指定する必要があります。テーブルに単一の primary_key フィールドがない場合 (私のように)、Meta で定義されたCompositeKeyが役立ちます。

primary_key = peewee.CompositeKey('date', 'team')
于 2014-05-26T06:22:23.070 に答える
0

を呼び出す前に、peewee の create table メソッドを使用して実際のデータベース テーブルを作成する必要がありselect()ます。これにより、テーブルに id 列が作成されます。

于 2013-03-21T22:39:22.423 に答える