1

dictオブジェクトを使用して多くを挿入しようとしているテーブルがあります。

engine = create_engine('sqlite:///:memory:', echo=True)
metadata = MetaData()
hockey= Table('hockey', metadata, 
    Column('team', String(16), primary_key=True),
    Column('jersey_colour', String(16)),
    Column('stadium', String(32)),
    Column('goals', Integer),
    Column('date', Date, primary_key=True),
    Column('assists', Integer))

>>>data[0]
{'jersey_colour': u'Blue',
 'team': u'Toronto Maple Leafs',
 'stadium': u'Air Canada Center',
 'date': '2013-03-25',
 'assists': 301,
 'goals': 151}

>>>data[1]
{'jersey_colour': u'Red',
 'team': u'Calgary Flames',
 'stadium': u'PenWest',
 'date': '2013-03-25',
 'assists': 254,
 'goals': 147}

conn = engine.connect()
conn.execute(ins, data)

StatementError:SQLiteの日付型はPythonの日付オブジェクトのみを入力として受け入れます。(元の原因:TypeError:SQLite DateタイプはPythonの日付オブジェクトのみを入力として受け入れます。)'INSERT INTO "hockey"(team、jersey_colour、stadium、goals、date、assists)VALUES(?、?、?、?、?、? )'[{' jersey_colour':'ブルー'、'チーム':'トロントメープルリーフス'、'スタジアム':u'エアカナダセンター'、'日付':' 2013-03-25'、'アシスト':301 、'目標':151}

  1. 最初の質問-パラメータが'に供給される順序は?' 案件。ご覧のとおり、フィールドは次のように表示されます。

    team
    jersey_colour
    stadium
    goals
    date
    assists
    

    ただし、辞書の順序は任意です。

    jersey_colour
    team
    stadium
    date
    assists
    goals
    

    これはsqliteまたはmysqlの問題ですか?理論的にはキーが提供されているので、データをどこに保存するかがわかるはずですが、よくわかりません。本番環境ではmysqlデータベースを使用しますが、テストではインメモリsqlitedbを使用します。

  2. 2番目の質問、エラー:

    StatementError: SQLite Date type only accepts Python date objects as input
    

    私は次のことを見つけました(https://groups.google.com/forum/?fromgroups=#!topic/sqlalchemy/EeZbkePPb38)。

    SQLiteには特にDATE型はありません。SQLAlchemyのDate()型は、Pythonの日時、つまり「import datetime; date = datetime.date(year、monthday)」を想定しています。

    データキーとペアになっている値は、コメンテーターが上で述べたことに従って、Pythonのdatetime.dateコマンドによって作成されます。

    >>>today_date = datetime.date.today()
    

そのため、エラーが発生している理由がわかりません。質問1と2の両方についてご協力いただきありがとうございます。ありがとうございました。

4

1 に答える 1

2
  1. SQLAlchemyは、バインドパラメーターと順序を処理します。それについて心配する必要はありません。

  2. SQLAlchemy ORMメタデータ定義で、日付列を処理することを指定しました。次に、SQLAlchemyは、バックエンドデータベースの正しい形式への変換を処理します。エラーはSQLLiteではなくSQLAlchemyから発生します。SAは日付オブジェクトを変換します。

    これは双方向です; SQLLiteを使用している場合でも、日付オブジェクトを挿入でき、クエリを実行すると、日付オブジェクト再び出力されます。

あなたがリンクしている投稿への返信は、そこで同じことについて話します。String()日付を文字列として保存する場合は列を使用し、列をタイプとして宣言する場合は代わりにdatetime.date()またはインスタンスを使用します。datetime.datetime()Date()

キーdateは文字列です。datetime.date()エラーを回避するには、代わりにオブジェクトを使用してください。

{'jersey_colour': u'Blue',
 'team': u'Toronto Maple Leafs',
 'stadium': u'Air Canada Center',
 'date': datetime.date(2013, 3, 25),
 'assists': 301,
 'goals': 151}
于 2013-03-26T18:39:12.027 に答える