Python で sqlite データベースへの sqlalchemy マッピングを設定するときに、「相互に依存するコードの配置」に関して少し問題があります。
目標は、次の条件を満たすスクリプトを作成することです。
filename
コマンド ライン引数としてパラメーターを取得します。- に基づいて
filename
、SQLite データベースへの絶対パスを作成する必要があります。 - データベースに接続し、
engine
- このデータベースのテーブルを反映する必要があります。
- テーブルには主キーがなく、sqlalchemy が主キーを必要とするため、テーブル内の列を主キー列にする必要があります
monkey patch
。id
mytable
だから私はこれを思いついた:
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
必要があります。Base
MyClass
- Iを作成できるようにするには、 の前に I を定義する
Base
必要があります。engine
Base
- Iを作成できるようにするには、 の前に I を定義する
engine
必要があります。path_to_file
engine
path_to_file
Iの外部で作成できるようにするには、 の前に定義するmain()
必要があります。create_file()
path_to_file
- 等々...
うまくいけば、私が立ち往生している場所がわかります...
助言がありますか?
編集:ちなみに、コードは機能しますが、スクリプトの先頭にハードコードされたファイル名のみがあります。