স্কেলচেমির ঘোষণামূলক ওআরএম এক্সটেনশন ব্যবহার করার সময় একাধিক কলাম সূচক


97

ক্লাসে ডকুমেন্টেশন এবং মন্তব্য অনুসারে sqlalchemy.Column, আমাদের sqlalchemy.schema.Indexএকাধিক কলাম রয়েছে এমন একটি সূচক নির্দিষ্ট করতে ক্লাসটি ব্যবহার করা উচিত ।

যাইহোক, উদাহরণটি দেখায় যে এটি সরাসরি টেবিল অবজেক্টটি ব্যবহার করে এটি কীভাবে করা যায়:

meta = MetaData()
mytable = Table('mytable', meta,
    # an indexed column, with index "ix_mytable_col1"
    Column('col1', Integer, index=True),

    # a uniquely indexed column with index "ix_mytable_col2"
    Column('col2', Integer, index=True, unique=True),

    Column('col3', Integer),
    Column('col4', Integer),

    Column('col5', Integer),
    Column('col6', Integer),
    )

# place an index on col3, col4
Index('idx_col34', mytable.c.col3, mytable.c.col4)

আমরা যদি ঘোষণামূলক ওআরএম এক্সটেনশন ব্যবহার করি তবে কীভাবে এটি করা উচিত?

class A(Base):
    __tablename__ = 'table_A'
    id = Column(Integer, , primary_key=True)
    a = Column(String(32))
    b = Column(String(32))

আমি কলাম "এ" এবং "বি" তে একটি সূচি চাই।


4
প্রশ্ন সম্পর্কে যদি আপনার একাধিক ইনডেক্স বা একাধিক কলাম একটি একক সূচক চান (- মূলত এটি delightfully চাইলেন এবং আরো আগে আমি এটা সম্পাদিত বিশৃঙ্খলা শুরু হয়ে গিয়েছিল কিনা একটু স্পষ্ট নয় "একটি সূচক একাধিক একাধিক সূচক ধারণ" )। তবে আমার মনে হয়, যেহেতু জাজেকের উত্তর দুটি ক্ষেত্রেই সম্বোধন করেছে।
মার্ক অ্যামেরি

উত্তর:


142

এগুলি কেবলমাত্র Columnঅবজেক্টস, সূচক = সত্যিকারের পতাকা স্বাভাবিকভাবে কাজ করে:

class A(Base):
    __tablename__ = 'table_A'
    id = Column(Integer, primary_key=True)
    a = Column(String(32), index=True)
    b = Column(String(32), index=True)

আপনি যদি একটি যৌগিক সূচক চান, আবার Tableএখানে যথারীতি উপস্থিত থাকেন আপনাকে কেবল এটি ঘোষণা করতে হবে না, সমস্ত কিছু একই রকম হয় (নিশ্চিত করুন যে আপনি সাম্প্রতিক ০. or বা ০. on এর উপরে ঘোষণামূলক এএ র‌্যাপারটি ব্যাখ্যা করার জন্য Columnশ্রেণীর ঘোষণা সম্পূর্ণ হওয়ার পরে):

class A(Base):
    __tablename__ = 'table_A'
    id = Column(Integer, primary_key=True)
    a = Column(String(32))
    b = Column(String(32))

Index('my_index', A.a, A.b)

0.7 ইন Indexহতে পারে Tableখুব আর্গুমেন্ট, যা ঘোষণামূলক সঙ্গে মারফত __table_args__:

class A(Base):
    __tablename__ = 'table_A'
    id = Column(Integer, primary_key=True)
    a = Column(String(32))
    b = Column(String(32))
    __table_args__ = (Index('my_index', "a", "b"), )

4
ধন্যবাদ, আমি 0.7 আপডেট এবং ব্যবহার table_args কাজ করে জরিমানা
yorjo

6
আমার মতো বর্তমানে টেবিল_রর্গের জন্য যদি আপনার অভিধান থাকে তবে কী হবে? টেবিল_আরগস = mys 'মাইএসকিএল_ইঙ্গিনা': 'ইনোডিবি'}
নিক হোল্ডেন


7
তাই আমি অনুমান আমি কি করতে পারি table_args = (ইনডেক্স ( 'my_index', "একটি", "খ"), { 'mysql_engine': 'InnoDB'})
নিক হল্ডেন

4
@ রায়ানচৌ ডকস.সেকলচেমি.আর.ইং / স্লেস্ট / হরম / এক্সটেনশানস / ডিক্লারেটিভ/ "অভিধান হিসাবে শেষ যুক্তিটি নির্দিষ্ট করে উপরের ফর্মের সাথে কীওয়ার্ড আর্গুমেন্টগুলি নির্দিষ্ট করা যেতে পারে"
zzzeek

13

@ Zzzeek এর উত্তর সম্পূর্ণ করতে ।

আপনি যদি ডিইএসসি সহ একটি যৌগিক সূচক যুক্ত করতে চান এবং ওআরএম ঘোষণামূলক পদ্ধতিটি ব্যবহার করতে পারেন তবে আপনি নীচের মতো করতে পারেন।

তদুপরি, আমি এসকিউএসএলেচেমির ফাংশনাল ইনডেক্সের ডকুমেন্টেশনের সাথে লড়াই করছিলাম, কীভাবে প্রতিস্থাপন করা যায় তা জানার চেষ্টা করছি mytable.c.somecol

from sqlalchemy import Index

Index('someindex', mytable.c.somecol.desc())

আমরা কেবলমাত্র মডেল সম্পত্তি ব্যবহার করতে এবং .desc()এটিতে কল করতে পারি:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class GpsReport(db.Model):
    __tablename__ = 'gps_report'

    id = db.Column(db.Integer, db.Sequence('gps_report_id_seq'), nullable=False, autoincrement=True, server_default=db.text("nextval('gps_report_id_seq'::regclass)"))

    timestamp = db.Column(db.DateTime, nullable=False, primary_key=True)

    device_id = db.Column(db.Integer, db.ForeignKey('device.id'), primary_key=True, autoincrement=False)
    device = db.relationship("Device", back_populates="gps_reports")


    # Indexes

    __table_args__ = (
        db.Index('gps_report_timestamp_device_id_idx', timestamp.desc(), device_id),
    )

যদি আপনি আলেম্বিক ব্যবহার করেন তবে আমি ফ্লাস্ক-মাইগ্রেট ব্যবহার করছি, এটি এমন কিছু উত্পন্ন করে:

from alembic import op  
import sqlalchemy as sa
# Added manually this import
from sqlalchemy.schema import Sequence, CreateSequence


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    # Manually added the Sequence creation
    op.execute(CreateSequence(Sequence('gps_report_id_seq')))

    op.create_table('gps_report',
    sa.Column('id', sa.Integer(), server_default=sa.text("nextval('gps_report_id_seq'::regclass)"), nullable=False),
    sa.Column('timestamp', sa.DateTime(), nullable=False))
    sa.Column('device_id', sa.Integer(), autoincrement=False, nullable=False),
    op.create_index('gps_report_timestamp_device_id_idx', 'gps_report', [sa.text('timestamp DESC'), 'device_id'], unique=False)


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_index('gps_report_timestamp_device_id_idx', table_name='gps_report')
    op.drop_table('gps_report')

    # Manually added the Sequence removal
    op.execute(sa.schema.DropSequence(sa.Sequence('gps_report_id_seq'))) 
    # ### end Alembic commands ###

শেষ অবধি আপনার পোস্টগ্রিজ এসকিউএল ডাটাবেসে নিম্নলিখিত টেবিল এবং সূচিপত্রগুলি থাকা উচিত:

psql> \d gps_report;
                                           Table "public.gps_report"
     Column      |            Type             | Collation | Nullable |                Default                 
-----------------+-----------------------------+-----------+----------+----------------------------------------
 id              | integer                     |           | not null | nextval('gps_report_id_seq'::regclass)
 timestamp       | timestamp without time zone |           | not null | 
 device_id       | integer                     |           | not null | 
Indexes:
    "gps_report_pkey" PRIMARY KEY, btree ("timestamp", device_id)
    "gps_report_timestamp_device_id_idx" btree ("timestamp" DESC, device_id)
Foreign-key constraints:
    "gps_report_device_id_fkey" FOREIGN KEY (device_id) REFERENCES device(id)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.