Python で sqlite データベースへの sqlalchemy マッピングを設定するときに、「相互に依存するコードの配置」に関して少し問題があります。
目標は、次の条件を満たすスクリプトを作成することです。
filenameコマンド ライン引数としてパラメーターを取得します。- に基づいて
filename、SQLite データベースへの絶対パスを作成する必要があります。 - データベースに接続し、
engine - このデータベースのテーブルを反映する必要があります。
- テーブルには主キーがなく、sqlalchemy が主キーを必要とするため、テーブル内の列を主キー列にする必要があります
monkey patch。idmytable
だから私はこれを思いついた:
from sqlalchemy import create_engine, Column, Integer
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
def create_path(file_name):
# generate absolute path to file_name
path_to_file = create_path("my_file_name.sqlite")
engine = create_engine('sqlite:///{path}'.format(path=path_to_file), echo=False)
Base = declarative_base()
Base.metadata.create_all(engine)
class MyTable(Base):
__tablename__ = 'my_table'
__table_args__ = {'autoload': True}
id = Column(Integer, primary_key=True) # Monkey patching the id column as primary key.
def main(argv):
# parse file_name here from argv
Session = sessionmaker(bind=engine)
session = Session()
for row in session.query(MyTable).all():
print row
return "Stop!"
if __name__ == '__main__':
sys.exit(main())
しかし、これは運命の構造であり、依存関係を壊さずにコードを再配置する方法がわかりません。
- Iを作成できるようにするには、 の前に I を定義する
MyClass必要があります。BaseMyClass - Iを作成できるようにするには、 の前に I を定義する
Base必要があります。engineBase - Iを作成できるようにするには、 の前に I を定義する
engine必要があります。path_to_fileengine path_to_fileIの外部で作成できるようにするには、 の前に定義するmain()必要があります。create_file()path_to_file- 等々...
うまくいけば、私が立ち往生している場所がわかります...
助言がありますか?
編集:ちなみに、コードは機能しますが、スクリプトの先頭にハードコードされたファイル名のみがあります。