FTRACK Query adalah pembungkus yang berorientasi objek di atas API FTRACK. Sementara sintaks kueri default sangat kuat, itu sepenuhnya berdasarkan teks sehingga kueri dinamis bisa sulit dibangun. Modul ini mendukung dan / atau operator dengan perbandingan bersarang.
Dianjurkan untuk pertama kali membaca https://ftrack-python-api.readthedocs.io/en/stable/tutorial.html untuk pemahaman dasar tentang bagaimana ftrack API bekerja.
pip install ftrack_query
Alih -alih menulis seluruh string kueri sekaligus, "pernyataan" dibangun ( mis. stmt = select('Task') ), dan kueri dapat dibangun dengan metode panggilan seperti .where() dan .populate() pada pernyataan tersebut.
Semua metode CRUD didukung ( create , select , update , delete ), tetapi fungsionalitas utama dirancang untuk digunakan dengan select . Pernyataan ini dibangun dengan sintaks yang sama dengan API utama sehingga harus langsung untuk transisi di antara keduanya.
Perhatikan bahwa ini sepenuhnya kompatibel ke belakang, sehingga pertanyaan yang ada tidak perlu ditulis ulang.
Contoh di bawah ini adalah untuk kueri yang sangat mendasar:
from ftrack_query import FTrackQuery , attr , create , select , and_ , or_
with FTrackQuery () as session :
# Select
project = session . select ( 'Project' ). where ( name = 'Test Project' ). one ()
# Create
task = session . execute (
create ( 'Task' ). values (
name = 'My Task' ,
project = project ,
)
)
session . commit ()
# Update
rows_updated = session . execute (
update ( 'Task' )
. where ( name = 'Old Task Name' )
. values ( name = 'New Task Name' )
)
session . commit ()
# Delete
rows_deleted = session . execute (
delete ( 'Task' ). where (
name = 'Old Task Name' ,
)
)
session . commit ()Untuk contoh yang jauh lebih kompleks:
ATTR_TYPE = attr ( 'type.name' )
TASK_STMT = (
select ( 'Task' )
# Filter the tasks
. where (
# Get any task without these statuses
~ attr ( 'status.name' ). in_ ([ 'Lighting' , 'Rendering' ]),
# Check for notes matching any of the following conditions:
attr ( 'notes' ). any (
# Ensure note was posted by someone outside the company
~ attr ( 'user.email' ). endswith ( '@company.com' )
# Ensure note either not completable or not completed
or_ (
and_ (
completed_by = None ,
is_todo = True ,
),
is_todo = False ,
),
),
# Ensure it has an animation task
or_ (
ATTR_TYPE . contains ( 'Animation' ),
ATTR_TYPE == 'Anim_Fixes' ,
),
),
# Order the results
. order_by (
ATTR_TYPE . desc (), # Equivalent to "type.name desc"
'name' ,
)
# Use projections to populate attributes as part of the query
. populate (
'name' ,
'notes' ,
'status.name' ,
ATTR_TYPE ,
)
. limit ( 5 )
)
with FTrackQuery () as session :
# Filter the above query to the result of another query
task_stmt = TASK_STMT . where (
project_id = session . select ( 'Project' ). where ( name = 'Test Project' ). one ()[ 'id' ]
)
# Use the current session to execute the statement
tasks = session . execute ( task_stmt ). all ()Sistem acara menggunakan bahasa kueri yang sedikit berbeda.
from ftrack_query import FTrackQuery , event
from ftrack_query . event import attr , and_ , or_
with FTrackQuery () as session :
session . event_hub . subscribe ( str (
and_ (
attr ( 'topic' ) == 'ftrack.update' ,
attr ( 'data.user.name' ) != getuser (),
)
))
session . event_hub . wait () Perhatikan bahwa attr() , and_() , dan or_() hadir dalam ftrack_query dan ftrack_query.event . Ini tidak dapat dipertukarkan, jadi jika keduanya diperlukan, maka impor event dan gunakan itu sebagai namespace.
Sesi Utama diwarisi dari ftrack_api.Session .
Bergabunglah dengan beberapa perbandingan.
Pintasan disediakan dengan & dan | ( mis. attr(a).contains(b) & attr(x).contains(y) ).
Membalikkan perbandingan input.
Pintasan disediakan dengan ~ ( mis. ~attr(x).contains(y) ).
Digunakan untuk membangun string kueri.
from ftrack_query import select
stmt = select ( entity ). where (...). populate (...) Calling session.execute(stmt) akan menjalankan kueri dan mengembalikan objek QueryResult Ftrack sendiri, dari mana .one() , .first() atau .all() dapat dipanggil. Sebagai alternatif, dengan menggunakan session.select(entity) , maka ini dapat dilewati.
Filter hasilnya.
Menggunakan kata kunci adalah cara tercepat, seperti .where(first_name='Peter', last_name='Hunt') . Untuk hal -hal yang lebih kompleks daripada pemeriksaan kesetaraan, menggunakan attr() direkomendasikan, seperti .where(attr('project.metadata').any(attr('key') != 'disabled')) .
Atribut Entitas Pra-Fetch.
Sebuah contoh, untuk mengulangi nama setiap pengguna, itu akan menjadi ide yang baik untuk memanggil .populate('first_name', 'last_name') sebagai bagian dari kueri. Tanpa itu, akan mengambil 2 kueri terpisah per pengguna, yang dikenal sebagai masalah kueri N+1.
Urutkan hasilnya berdasarkan atribut.
Atribut dan ketertiban dapat diberikan dalam format attr('name').desc() , atau sebagai string mentah seperti name descending . Pesanan akan default untuk ascending jika tidak disediakan.
Membalikkan arah penyortiran.
Batasi jumlah hasil ke nilai tertentu.
Catatan: Ini tidak sesuai dengan panggilan .first() atau .one() .
Dalam hal menggunakan batas, oleskan offset ke hasil yang dikembalikan.
Hanya untuk pengguna tingkat lanjut.
page_size : Tetapkan jumlah hasil yang akan diambil sekaligus dari FTRACK.session : Lampirkan objek sesi ke kueri. Jadikan pernyataan sebagai subquery untuk digunakan di dalam .in_() .
Ini memastikan selalu ada "pilih dari" sebagai bagian dari pernyataan. Mengatur secara manual parameter atribut akan mengesampingkan proyeksi yang ada.
Digunakan untuk membuat entitas baru.
from ftrack_query import create
stmt = create ( entity ). values (...) Calling session.execute(stmt) akan mengembalikan entitas yang dibuat.
Nilai untuk membuat entitas dengan.
Digunakan untuk mengumpulkan nilai pembaruan pada banyak entitas. Ini dibangun dari metode select sehingga berisi banyak metode yang sama.
from ftrack_query import update
stmt = update ( entity ). where (...). values (...) session.execute(stmt) akan mengembalikan berapa banyak entitas yang ditemukan dan diperbarui.
Saring apa yang harus diperbarui.
Nilai untuk memperbarui entitas.
Digunakan untuk menghapus entitas. Ini dibangun dari metode select sehingga berisi banyak metode yang sama.
from ftrack_query import delete
stmt = delete ( entity ). where (...). options ( remove_components = True ) session.execute(stmt) akan mengembalikan berapa banyak entitas yang dihapus.
Saring apa yang harus diperbarui.
remove_components : Lepaskan entitas Component apa pun dari setiap Location yang mengandungnya sebelum dihapus. Ini tidak diaktifkan secara default karena tidak dapat digulung kembali. Objek Comparison dirancang untuk mengonversi data ke string. Ini berisi beragam operator yang dapat digunakan terhadap tipe data apa pun, termasuk objek Comparison lainnya. Fungsi attr adalah jalan pintas untuk ini.
Perbandingan apa pun dapat dibalik dengan ~ awalan atau fungsi not_ .
attr(key) == 'value'attr(key) > 5attr(key).like('value%')attr(key).after(arrow.now().floor('day'))attr(key).has(subkey='value')attr(key).any(subkey='value')attr(key).in_(subquery)Perbandingan sederhana.
Lakukan cek untuk memeriksa apakah atribut cocok dengan hasil apa pun.
Ini dapat menerima subquery seperti itu .in_('select id from table where x is y') , atau daftar item seperti .in_(['x', 'y']) .
Periksa apakah string terkandung dalam kueri. Gunakan tanda persen sebagai wildcard jika menggunakan like atau not_like ; Sisanya adalah pintasan dan melakukan ini secara otomatis.
Tes melawan skalar dan hubungan pengumpulan.
Tes terhadap tanggal. Menggunakan objek arrow direkomendasikan.
# Project
select ( 'Project' )
# Project where status is active
select ( 'Project' ). where ( status = 'active' )
# Project where status is active and name like "%thrones"
select ( 'Project' ). where ( attr ( 'name' ). like ( '%thrones' ), status = 'active' )
# session.query('Project where status is active and (name like "%thrones" or full_name like "%thrones")')
select ( 'Project' ). where ( or_ ( attr ( 'name' ). like ( '%thrones' ), attr ( 'full_name' ). like ( '%thrones' )), status = 'active' )
# session.query('Task where project.id is "{0}"'.format(project['id']))
select ( 'Task' ). where ( project = project )
# session.query('Task where project.id is "{0}" and status.type.name is "Done"'.format(project['id']))
select ( 'Task' ). where ( attr ( 'status.type.name' ) == 'Done' , project = project )
# session.query('Task where timelogs.start >= "{0}"'.format(arrow.now().floor('day')))
select ( 'Task' ). where ( attr ( 'timelogs.start' ) >= arrow . now (). floor ( 'day' ))
# session.query('Note where author has (first_name is "Jane" and last_name is "Doe")')
select ( 'Note' ). where ( attr ( 'author' ). has ( first_name = 'Jane' , last_name = 'Doe' ))
# session.query('User where not timelogs any ()')
select ( 'User' ). where ( ~ attr ( 'timelogs' ). any ())
# projects = session.query('select full_name, status.name from Project')
select ( 'Project' ). populate ( 'full_name' , 'status.name' )
# select name from Project where allocations.resource[Group].memberships any (user.username is "john_doe")
select ( 'Project' ). select ( 'name' ). where ( attr ( 'allocations.resource[Group].memberships' ). any ( attr ( 'user.username' ) == 'john_doe' ))
# Note where parent_id is "{version_id}" or parent_id in (select id from ReviewSessionObject where version_id is "{version_id}")
select ( 'Note' ). where ( or_ ( attr ( 'parent_id' ). in_ ( select ( 'ReviewSessionObject' ). where ( version_id = version_id ). subquery ()), parent_id = version_id ))