আপনি যা যা জিজ্ঞাসা করছেন তা হ'ল ডেটা মাইগ্রেশন , স্কিমা মাইগ্রেশনের বিপরীতে যা আলেম্বিক ডক্সে সর্বাধিক প্রচলিত।
এই উত্তরটি ধরে নিয়েছে যে আপনি আপনার মডেলগুলি সংজ্ঞায়িত করতে ঘোষক (ক্লাস-ম্যাপার-টেবিল বা মূলের বিপরীতে) ব্যবহার করছেন। এটি অন্যান্য ফর্মের সাথে খাপ খাইয়ে তুলনামূলকভাবে সহজ হওয়া উচিত।
নোট করুন যে আলেম্বিক কিছু প্রাথমিক তথ্য ফাংশন সরবরাহ করে: op.bulk_insert()
এবং op.execute()
। যদি অপারেশনগুলি মোটামুটি ন্যূনতম হয় তবে সেগুলি ব্যবহার করুন। যদি মাইগ্রেশনটির জন্য সম্পর্ক বা অন্যান্য জটিল ইন্টারঅ্যাকশন প্রয়োজন, আমি নীচে বর্ণিত হিসাবে মডেল এবং সেশনের পূর্ণ শক্তি ব্যবহার করতে পছন্দ করি।
নিম্নলিখিতটি মাইগ্রেশন স্ক্রিপ্টের একটি উদাহরণ যা কিছু ঘোষিত মডেল সেট আপ করে যা একটি সেশনে ডেটা ম্যানিপুলেট করার জন্য ব্যবহৃত হবে। মূল বিষয়গুলি হ'ল:
আপনার প্রয়োজনীয় কলামগুলির সাথে আপনার প্রয়োজনীয় বুনিয়াদি মডেলগুলি সংজ্ঞায়িত করুন। আপনার প্রতিটি কলামের প্রয়োজন নেই, কেবলমাত্র প্রাথমিক কী এবং আপনি যেটি ব্যবহার করছেন সেগুলি।
আপগ্রেড ফাংশনের মধ্যে, op.get_bind()
বর্তমান সংযোগ পেতে ব্যবহার করুন এবং এটি দিয়ে একটি সেশন তৈরি করুন।
- অথবা
bind.execute()
এসকিউএল কোয়েরিগুলি সরাসরি লিখতে এসকিউএএলএলচেমির নীচের স্তরটি ব্যবহার করুন। এটি সাধারণ মাইগ্রেশনগুলির জন্য দরকারী।
আপনার অ্যাপ্লিকেশনটিতে যেমন আপনি সাধারণত মডেল এবং সেশন ব্যবহার করেন তেমন ব্যবহার করুন।
"""create teams table
Revision ID: 169ad57156f0
Revises: 29b4c2bfce6d
Create Date: 2014-06-25 09:00:06.784170
"""
revision = '169ad57156f0'
down_revision = '29b4c2bfce6d'
from alembic import op
import sqlalchemy as sa
from sqlalchemy import orm
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Player(Base):
__tablename__ = 'players'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String, nullable=False)
team_name = sa.Column('team', sa.String, nullable=False)
team_id = sa.Column(sa.Integer, sa.ForeignKey('teams.id'), nullable=False)
team = orm.relationship('Team', backref='players')
class Team(Base):
__tablename__ = 'teams'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String, nullable=False, unique=True)
def upgrade():
bind = op.get_bind()
session = orm.Session(bind=bind)
Team.__table__.create(bind)
op.add_column('players', sa.Column('team_id', sa.ForeignKey('teams.id'), nullable=False)
teams = {name: Team(name=name) for name in session.query(Player.team).distinct()}
session.add_all(teams.values())
for player in session.query(Player):
player.team = teams[player.team_name]
session.commit()
op.drop_column('players', 'team')
def downgrade():
bind = op.get_bind()
session = orm.Session(bind=bind)
op.add_column('players', sa.Column('team', sa.String, nullable=False)
for player in session.query(Player):
player.team_name = player.team.name
session.commit()
op.drop_column('players', 'team_id')
op.drop_table('teams')
মাইগ্রেশন পৃথক মডেলগুলি সংজ্ঞায়িত করে কারণ আপনার কোডের মডেলগুলি ডাটাবেসের বর্তমান অবস্থার প্রতিনিধিত্ব করে , যখন মাইগ্রেশনগুলি পথের বিভিন্ন পদক্ষেপের প্রতিনিধিত্ব করে । আপনার ডাটাবেসটি সেই পথে কোনও রাজ্যেই থাকতে পারে, তাই মডেলগুলি এখনও ডাটাবেসের সাথে সিঙ্ক আপ করতে পারে না। আপনি যদি খুব যত্নবান না হন তবে সত্যিকারের মডেলগুলি সরাসরি ব্যবহারের ফলে নিখোঁজ কলাম, অবৈধ ডেটা ইত্যাদির সমস্যা দেখা দেবে এটি পরিস্কারে আপনি কী কলাম এবং মডেলগুলি ব্যবহার করবেন তা স্পষ্টভাবে জানিয়ে দেওয়া আরও পরিষ্কার।
op.execute
মধ্যেupgrade()
সেখানে দ্বারা ব্যবহার করা হবে একটি ডিফল্ট টেমপ্লেট প্রদান একটি উপায়alembic revision
কমান্ড (উত্পন্ন জন্য একটি ডিফল্ট শরীর.py
ফাইল)?