| <div role="region"><a href="#" class="skipToContent_fXgn">Skip to main content</a></div><nav class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Navigation bar toggle" class="navbar__toggle clean-btn" type="button" tabindex="0"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo.svg" alt="apache devlake" class="themedImage_ToTc themedImage--light_HNdA"><img src="/img/logo.svg" alt="apache devlake" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">Apache DevLake</b></a></div><div class="navbar__items navbar__items--right"><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Docs</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/docs/Overview/Introduction">Next</a></li><li><a class="dropdown__link" href="/docs/v1.0/Overview/Introduction">v1.0 (Stable)</a></li><li><a class="dropdown__link" href="/docs/v0.21/Overview/Introduction">v0.21</a></li><li><a class="dropdown__link" href="/docs/v0.20/Overview/Introduction">v0.20</a></li><li><a class="dropdown__link" href="/docs/v0.19/Overview/Introduction">v0.19</a></li><li><a class="dropdown__link" href="/docs/v0.18/Overview/Introduction">v0.18</a></li><li><a class="dropdown__link" href="/docs/v0.17/Overview/Introduction">v0.17</a></li><li><a class="dropdown__link" href="/docs/v0.16/Overview/Introduction">v0.16</a></li><li><a class="dropdown__link" href="/docs/v0.15/Overview/Introduction">v0.15</a></li></ul></div><a class="navbar__item navbar__link" href="/livedemo/EngineeringLeads/DORA">Use Cases</a><a class="navbar__item navbar__link" href="/community/">Community</a><a class="navbar__item navbar__link" href="/team">Team</a><a class="navbar__item navbar__link" href="/blogOverview">Blog</a><a href="https://github.com/apache/devlake" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub</a><a class="navbar__item navbar__link" href="/download">Download</a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">ASF</a><ul class="dropdown__menu"><li><a href="https://www.apache.org/" target="_blank" rel="noopener noreferrer" class="dropdown__link">Foundation</a></li><li><a href="https://www.apache.org/licenses/" target="_blank" rel="noopener noreferrer" class="dropdown__link">License</a></li><li><a href="https://www.apache.org/events/current-event" target="_blank" rel="noopener noreferrer" class="dropdown__link">Events</a></li><li><a href="https://www.apache.org/security/" target="_blank" rel="noopener noreferrer" class="dropdown__link">Security</a></li><li><a href="https://privacy.apache.org/policies/privacy-policy-public.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Privacy</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Sponsorship</a></li><li><a href="https://www.apache.org/foundation/thanks.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Thanks</a></li></ul></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"><div class="navbar__search searchBarContainer_NW3z"><input placeholder="Search" aria-label="Search" class="navbar__search-input"><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebar_njMd"><nav class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/docs/Overview">Overview</a><button aria-label="Toggle the collapsible sidebar category 'Overview'" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/docs/GettingStarted">Getting Started</a><button aria-label="Toggle the collapsible sidebar category 'Getting Started'" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/docs/Config UI">Config UI</a><button aria-label="Toggle the collapsible sidebar category 'Config UI'" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/DORA">DORA</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/docs/Metrics">Metrics</a><button aria-label="Toggle the collapsible sidebar category 'Metrics'" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/docs/DataModels">Data Models</a><button aria-label="Toggle the collapsible sidebar category 'Data Models'" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" href="/docs/DeveloperManuals">Developer Manuals</a><button aria-label="Toggle the collapsible sidebar category 'Developer Manuals'" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/DeveloperManuals/DeveloperSetup">Developer Setup</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/DeveloperManuals/SourceCodeReference">Source Code References</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/DeveloperManuals/PluginImplementation">Plugin Implementation</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/DeveloperManuals/DBMigration">DB Migration</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/DeveloperManuals/Notifications">Notifications</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/DeveloperManuals/Dal">Dal</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/DeveloperManuals/Project">Project</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/DeveloperManuals/TagNamingConventions">Tag Naming Conventions</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/DeveloperManuals/E2E-Test-Guide">E2E Test Guide</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/DeveloperManuals/Release-SOP">DevLake Release Guide</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/DeveloperManuals/ReservedColumns">Reserved Columns</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/DeveloperManuals/UnitTest">UnitTest Test Guide</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/docs/Plugins">Plugins</a><button aria-label="Toggle the collapsible sidebar category 'Plugins'" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" href="/docs/Troubleshooting">Troubleshooting</a><button aria-label="Toggle the collapsible sidebar category 'Troubleshooting'" type="button" class="clean-btn menu__caret"></button></div></li></ul></nav></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_OVgt"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/DeveloperManuals"><span itemprop="name">Developer Manuals</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Reserved Columns</span><meta itemprop="position" content="2"></li></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: Next</span><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><h1>Reserved Columns</h1><h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a class="hash-link" href="#summary" title="Direct link to heading"></a></h2><p>DevLake's base model structs (<code>common.NoPKModel</code> and <code>common.Model</code>) automatically manage certain columns. These columns are <strong>reserved</strong> and must not be used to store data originating from external data sources. This page explains which columns are reserved, why they exist, and what naming conventions to follow when your plugin needs to store timestamps from a data source.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="reserved-column-names">Reserved Column Names<a class="hash-link" href="#reserved-column-names" title="Direct link to heading"></a></h2><p>The following columns are reserved by DevLake:</p><table><thead><tr><th>Column</th><th>Type</th><th>Purpose</th></tr></thead><tbody><tr><td><code>created_at</code></td><td><code>datetime(3)</code></td><td>Automatically set to the time the record is <strong>inserted</strong> into DevLake's database.</td></tr><tr><td><code>updated_at</code></td><td><code>datetime(3)</code></td><td>Automatically set to the time the record is last <strong>updated</strong> in DevLake's database.</td></tr><tr><td><code>_raw_data_params</code></td><td><code>varchar(255)</code></td><td>Links the record back to its raw-layer source.</td></tr><tr><td><code>_raw_data_table</code></td><td><code>varchar(255)</code></td><td>Identifies which raw table the record was extracted from.</td></tr><tr><td><code>_raw_data_id</code></td><td><code>bigint</code></td><td>References the specific row in the raw table.</td></tr></tbody></table><p>The <code>created_at</code> and <code>updated_at</code> columns are managed by GORM's <code>autoCreateTime</code> and <code>autoUpdateTime</code> tags on the <code>NoPKModel</code> base struct. They reflect <strong>when DevLake processed the record</strong>, not when the record was created or updated in the original data source.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-this-matters">Why This Matters<a class="hash-link" href="#why-this-matters" title="Direct link to heading"></a></h2><p>If a plugin maps a data source's creation or update timestamp directly to <code>created_at</code> or <code>updated_at</code>, the value will be silently overwritten by GORM's auto-timestamp behavior. This means:</p><ul><li>The source-system timestamp is lost.</li><li>The column no longer accurately reflects DevLake's own processing time.</li><li>Downstream queries and dashboards that rely on these columns may produce incorrect results.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="naming-convention-for-source-timestamps">Naming Convention for Source Timestamps<a class="hash-link" href="#naming-convention-for-source-timestamps" title="Direct link to heading"></a></h2><p>When your plugin model needs to store timestamps from an external data source, use a <strong>prefixed column name</strong> that identifies the source system. Here are examples from existing plugins:</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="go-tool-layer-models">Go (Tool-Layer Models)<a class="hash-link" href="#go-tool-layer-models" title="Direct link to heading"></a></h3><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// ✅ Correct — use a source-specific prefix</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> GithubIssue </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ConnectionId </span><span class="token builtin">uint64</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">`gorm:"primaryKey"`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> GithubId </span><span class="token builtin">int</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">`gorm:"primaryKey"`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> GithubCreatedAt time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Time </span><span class="token comment" style="color:#999988;font-style:italic">// timestamp from GitHub</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> GithubUpdatedAt time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Time </span><span class="token string" style="color:#e3116c">`gorm:"index"`</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// timestamp from GitHub</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> common</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NoPKModel </span><span class="token comment" style="color:#999988;font-style:italic">// provides created_at, updated_at</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// ❌ Wrong — overwrites DevLake's auto-managed columns</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> GithubIssue </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ConnectionId </span><span class="token builtin">uint64</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">`gorm:"primaryKey"`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> GithubId </span><span class="token builtin">int</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">`gorm:"primaryKey"`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> CreatedAt time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Time </span><span class="token comment" style="color:#999988;font-style:italic">// conflicts with NoPKModel</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> UpdatedAt time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Time </span><span class="token comment" style="color:#999988;font-style:italic">// conflicts with NoPKModel</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> common</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NoPKModel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="go-domain-layer-models">Go (Domain-Layer Models)<a class="hash-link" href="#go-domain-layer-models" title="Direct link to heading"></a></h3><p>Domain-layer models follow the same rule. Use descriptive names like <code>CreatedDate</code>, <code>UpdatedDate</code>, or source-prefixed names:</p><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> GitlabDeployment </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> common</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NoPKModel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ConnectionId </span><span class="token builtin">uint64</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">`gorm:"primaryKey"`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> GitlabId </span><span class="token builtin">int</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">`gorm:"primaryKey"`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> CreatedDate time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Time </span><span class="token string" style="color:#e3116c">`json:"created_date"`</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// from GitLab API</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> UpdatedDate </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Time </span><span class="token string" style="color:#e3116c">`json:"updated_date"`</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// from GitLab API</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="python-pydevlake-models">Python (PyDevLake Models)<a class="hash-link" href="#python-pydevlake-models" title="Direct link to heading"></a></h3><p>The same convention applies to Python plugins. The <code>NoPKModel</code> base class in PyDevLake provides <code>created_at</code> and <code>updated_at</code> automatically:</p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">MyToolIssue</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ToolModel</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># ✅ Correct</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> tool_created_at</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> datetime </span><span class="token comment" style="color:#999988;font-style:italic"># timestamp from the external tool</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> tool_updated_at</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> datetime </span><span class="token comment" style="color:#999988;font-style:italic"># timestamp from the external tool</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># ❌ Wrong — these conflict with NoPKModel</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># created_at: datetime</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># updated_at: datetime</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="common-prefixes-used-across-plugins">Common Prefixes Used Across Plugins<a class="hash-link" href="#common-prefixes-used-across-plugins" title="Direct link to heading"></a></h2><table><thead><tr><th>Plugin</th><th>Prefix Pattern</th><th>Example</th></tr></thead><tbody><tr><td>GitHub</td><td><code>Github</code></td><td><code>GithubCreatedAt</code>, <code>GithubUpdatedAt</code></td></tr><tr><td>GitLab</td><td><code>Gitlab</code></td><td><code>GitlabCreatedAt</code>, <code>GitlabUpdatedAt</code></td></tr><tr><td>Jira</td><td><code>Created</code>, <code>Updated</code></td><td><code>Created</code>, <code>Updated</code> (Jira-specific fields)</td></tr><tr><td>Generic</td><td><code>CreatedDate</code> / <code>UpdatedDate</code></td><td><code>CreatedDate</code>, <code>UpdatedDate</code></td></tr></tbody></table><p>Pick whichever prefix is most natural for your data source, but <strong>never</strong> use the bare names <code>created_at</code> / <code>updated_at</code> (or their Go equivalents <code>CreatedAt</code> / <code>UpdatedAt</code> without a prefix).</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="quick-checklist">Quick Checklist<a class="hash-link" href="#quick-checklist" title="Direct link to heading"></a></h2><p>When defining a new tool-layer or domain-layer model:</p><ol><li><strong>Embed <code>common.NoPKModel</code></strong> (Go) or extend <code>NoPKModel</code> / <code>ToolModel</code> (Python) — this gives you <code>created_at</code> and <code>updated_at</code> for free.</li><li><strong>Do not</strong> add your own <code>CreatedAt</code> or <code>UpdatedAt</code> fields without a source-specific prefix.</li><li><strong>Name source timestamps</strong> with a prefix that identifies the data source (e.g., <code>GithubCreatedAt</code>) or use a generic alternative like <code>CreatedDate</code>.</li><li><strong>Document</strong> the meaning of each timestamp field with a comment or <code>gorm:"comment:..."</code> tag so that other contributors understand which system the timestamp originates from.</li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a class="hash-link" href="#references" title="Direct link to heading"></a></h2><ul><li>Base model definition: <a href="https://github.com/apache/incubator-devlake/tree/main/backend/core/models/common" target="_blank" rel="noopener noreferrer"><code>models/common</code></a></li><li><a href="https://github.com/apache/incubator-devlake/pull/8701" target="_blank" rel="noopener noreferrer">PR #8701</a> — CircleCI column naming fix that prompted this convention to be formally documented.</li></ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/apache/devlake-website/edit/main/docs/DeveloperManuals/ReservedColumns.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_vwxv"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/DeveloperManuals/Release-SOP"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">DevLake Release Guide</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/DeveloperManuals/UnitTest"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">UnitTest Test Guide</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#summary" class="table-of-contents__link toc-highlight">Summary</a></li><li><a href="#reserved-column-names" class="table-of-contents__link toc-highlight">Reserved Column Names</a></li><li><a href="#why-this-matters" class="table-of-contents__link toc-highlight">Why This Matters</a></li><li><a href="#naming-convention-for-source-timestamps" class="table-of-contents__link toc-highlight">Naming Convention for Source Timestamps</a><ul><li><a href="#go-tool-layer-models" class="table-of-contents__link toc-highlight">Go (Tool-Layer Models)</a></li><li><a href="#go-domain-layer-models" class="table-of-contents__link toc-highlight">Go (Domain-Layer Models)</a></li><li><a href="#python-pydevlake-models" class="table-of-contents__link toc-highlight">Python (PyDevLake Models)</a></li></ul></li><li><a href="#common-prefixes-used-across-plugins" class="table-of-contents__link toc-highlight">Common Prefixes Used Across Plugins</a></li><li><a href="#quick-checklist" class="table-of-contents__link toc-highlight">Quick Checklist</a></li><li><a href="#references" class="table-of-contents__link toc-highlight">References</a></li></ul></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/GettingStarted">Getting Started</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/DataModels/DevLakeDomainLayerSchema">Data Models</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/Metrics">Engineering Metrics</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://join.slack.com/t/devlake-io/shared_invite/zt-1lkgbdmys-AU2azidzO1u~mtjlg9my7A" target="_blank" rel="noopener noreferrer" class="footer__link-item">Slack</a></li><li class="footer__item"><a href="https://github.com/apache/incubator-devlake/issues" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Issue Tracker</a></li><li class="footer__item"><a href="https://github.com/apache/devlake-website/issues" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Issue Tracker For Docs</a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/apache/devlake" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub</a></li><li class="footer__item"><a href="https://twitter.com/ApacheDevLake" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter</a></li><li class="footer__item"><a class="footer__link-item" href="/community/trademark">Trademark Guidelines</a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright"> |