9

私は SQLAlchemy に本当に慣れていませんが、とても気に入っています。現在、私は手動で多くのことを行っており、より「pythonically」かつ動的に物事を行いたいと考えています。

例として、テーブルを手動で作成/定義するこの短いスクリプトと、そのテーブルにデータを挿入する関数があります。

データベース接続

import os
from sqlalchemy import *
from sqlalchemy import schema, types
from sqlalchemy.ext.declarative import declarative_base  

db_url = os.environ.get('DATABASE_URL')
engine = create_engine(db_url)
Base = declarative_base(engine)
meta = Base.metadata

テーブル定義

file_paths = Table('file_paths', meta,
    Column('table_id', Integer, primary_key = True),
    Column('fullpath', String(255)),
    Column('filename', String(255)),
    Column('extension', String(255)),
    Column('created', String(255)),
    Column('modified', String(255)),
    Column('size', Integer),
    Column('owner', String(255)),
    Column('permissions', Integer),
    mysql_engine='InnoDB',
)
file_paths.drop(engine, checkfirst = False)
file_paths.create(engine, checkfirst = True)

insert 関数は文字列とリストを引数として取ります

def push_to_db(fullpath, fileInfo):
    i = file_paths.insert()
    i.execute(  fullpath    = str(fullpath), 
            filename    = str(fileInfo[0]),
            extension   = str(fileInfo[1]),
            created     = str(fileInfo[2]),
            modified    = str(fileInfo[3]),
            size        = str(fileInfo[4]),
            owner       = str(fileInfo[5]),
            permissions = str(fileInfo[6]),
         )

これは機能しますが、見栄えが悪く、オンラインのどこかで見つけたチュートリアルからそのまま引用しています。私の目標は、これらの操作を動的にすることです。

サンプルクラス

class FileMeta(object):
    def __init__(self, fullPathFileName, filename):
        self.fullPathFileName = fullPathFileName
        self.filename = filename
        self.extension = os.path.splitext(self.filename)[1].lower()
        ...

    def fileMetaList(self):
        return [self.filename, self.extension, self.created, self.modified,\
                self.size, self.owner, self.permissions]

シナリオは次のとおりです。クラスオブジェクトが与えられた場合

  1. クラスメンバー変数に従ってテーブルを動的に定義する
    • 列番号と名前は変数名に対応する必要があります
    • または、クラス変数のリスト内のその変数のインデックスに対応します
  2. クラスから対応する動的に作成されたテーブルにデータを挿入できる関数を作成する

私の直感では、これが SQLAlchemy が適していることを示しています。このプロセスの概要を説明できる優れたチュートリアルまたはリファレンスを誰か教えてもらえますか?

4

2 に答える 2

20

代わりに宣言型拡張機能を使用したい場合:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class FilePaths(Base):
    __tablename__ = 'file_paths'
    __table_args__ = {'mysql_engine':'InnoDB'}

    table_id = Column(Integer, primary_key=True)
    fullpath = Column(String(255))
    filename = Column(String(255))
    extension = Column(String(255))
    created = Column(String(255))
    modified = Column(String(255))
    size = Column(Integer)
    owner = Column(String(255))
    permissions = Column(Integer)

Base.metadata.create_all(engine)

__init__()必要に応じて独自のメソッドや他のメソッドを定義し、これらのインスタンスを作成して新しい行を挿入できます。

SQLAlchemy 独自の ORM チュートリアルを参照してください。

于 2013-05-15T21:31:29.947 に答える