mirror of https://github.com/nocodb/nocodb
Muhammed Mustafa
2 years ago
19 changed files with 673 additions and 57 deletions
@ -0,0 +1,16 @@
|
||||
import { SettingsPage } from "."; |
||||
import { ErdBasePage } from "../commonBase/Erd"; |
||||
|
||||
|
||||
export class SettingsErdPage extends ErdBasePage { |
||||
readonly settings: SettingsPage; |
||||
|
||||
constructor(settings: SettingsPage) { |
||||
super(settings.rootPage); |
||||
this.settings = settings; |
||||
} |
||||
|
||||
get() { |
||||
return this.rootPage.locator(`[pw-data="nc-settings-subtab-ERD View"]`); |
||||
} |
||||
} |
@ -0,0 +1,20 @@
|
||||
import { expect } from '@playwright/test'; |
||||
import { SettingsPage } from '.'; |
||||
import BasePage from '../../Base'; |
||||
|
||||
export class MiscSettingsPage extends BasePage { |
||||
private readonly settings: SettingsPage; |
||||
|
||||
constructor(settings: SettingsPage) { |
||||
super(settings.rootPage); |
||||
this.settings = settings; |
||||
} |
||||
|
||||
get() { |
||||
return this.settings.get().locator(`[pw-data="nc-settings-subtab-Miscellaneous"]`); |
||||
} |
||||
|
||||
async clickShowM2MTables() { |
||||
await this.get().locator('input[type="checkbox"]').click(); |
||||
} |
||||
} |
@ -0,0 +1,19 @@
|
||||
import { ToolbarActionsPage } from "."; |
||||
import { ErdBasePage } from "../../commonBase/Erd"; |
||||
|
||||
export class ToolbarActionsErdPage extends ErdBasePage { |
||||
readonly toolbarActions: ToolbarActionsPage; |
||||
|
||||
constructor(toolbarActions: ToolbarActionsPage) { |
||||
super(toolbarActions.rootPage); |
||||
this.toolbarActions = toolbarActions; |
||||
} |
||||
|
||||
get() { |
||||
return this.rootPage.locator(`.erd-single-table-modal`); |
||||
} |
||||
|
||||
async close() { |
||||
await this.get().locator('.nc-modal-close').click(); |
||||
} |
||||
} |
@ -0,0 +1,22 @@
|
||||
import BasePage from "../../../Base"; |
||||
import { ToolbarPage } from ".."; |
||||
import { ToolbarActionsErdPage } from "./Erd"; |
||||
|
||||
export class ToolbarActionsPage extends BasePage { |
||||
readonly toolbar: ToolbarPage; |
||||
readonly erd: ToolbarActionsErdPage; |
||||
|
||||
constructor(toolbar: ToolbarPage) { |
||||
super(toolbar.rootPage); |
||||
this.toolbar = toolbar; |
||||
this.erd = new ToolbarActionsErdPage(this); |
||||
} |
||||
|
||||
get() { |
||||
return this.rootPage.locator(`[pw-data="toolbar-actions"]`); |
||||
} |
||||
|
||||
async click(label: string) { |
||||
await this.get().locator(`span:has-text("${label}")`).click(); |
||||
} |
||||
} |
@ -0,0 +1,84 @@
|
||||
import { expect } from '@playwright/test'; |
||||
import BasePage from '../../Base'; |
||||
|
||||
export abstract class ErdBasePage extends BasePage { |
||||
vueFlow() { |
||||
return this.get().locator('.vue-flow__viewport'); |
||||
} |
||||
|
||||
async clickShowColumnNames() { |
||||
await this.get().locator(`.nc-erd-showColumns-checkbox`).click(); |
||||
(await this.vueFlow().elementHandle())?.waitForElementState('stable'); |
||||
} |
||||
|
||||
async dbClickShowColumnNames() { |
||||
await this.get().locator(`.nc-erd-showColumns-label`).dblclick(); |
||||
(await this.vueFlow().elementHandle())?.waitForElementState('stable'); |
||||
} |
||||
|
||||
async clickShowPkAndFk() { |
||||
await this.get().locator(`.nc-erd-showPkAndFk-checkbox`).click(); |
||||
(await this.vueFlow().elementHandle())?.waitForElementState('stable'); |
||||
} |
||||
|
||||
async clickShowSqlViews() { |
||||
await this.get().locator(`.nc-erd-showViews-checkbox`).click(); |
||||
(await this.vueFlow().elementHandle())?.waitForElementState('stable'); |
||||
} |
||||
|
||||
async clickShowMMTables() { |
||||
await this.get().locator(`.nc-erd-showMMTables-checkbox`).click(); |
||||
(await this.vueFlow().elementHandle())?.waitForElementState('stable'); |
||||
} |
||||
|
||||
async clickShowJunctionTableNames() { |
||||
await this.get().locator(`.nc-erd-showJunctionTableNames-checkbox`).click(); |
||||
(await this.vueFlow().elementHandle())?.waitForElementState('stable'); |
||||
} |
||||
|
||||
async verifyEasterEggNotShown() { |
||||
await expect(await this.get().locator('.nc-erd-showMMTables-checkbox')).not.toBeVisible() |
||||
} |
||||
|
||||
async verifyNode({tableName, columnName, columnNameShouldNotExist}: {tableName: string; columnName?: string, columnNameShouldNotExist?: string}) { |
||||
expect(await this.get().locator(`.nc-erd-table-node-${tableName}`)).toBeVisible(); |
||||
if (columnName) { |
||||
expect(await this.get().locator(`.nc-erd-table-node-${tableName}-column-${columnName}`)).toBeVisible(); |
||||
} |
||||
if(columnNameShouldNotExist) { |
||||
expect(await this.get().locator(`.nc-erd-table-node-${tableName}-column-${columnNameShouldNotExist}`)).not.toBeVisible(); |
||||
} |
||||
} |
||||
|
||||
async verifyNodeDoesNotExist({tableName}: {tableName: string}) { |
||||
expect(await this.get().locator(`.nc-erd-table-node-${tableName}`)).not.toBeVisible(); |
||||
} |
||||
|
||||
async verifyColumns({tableName, columns}: {tableName: string; columns: string[]}) { |
||||
for (const column of columns) { |
||||
await this.verifyNode({tableName, columnName: column}); |
||||
} |
||||
} |
||||
|
||||
async verifyNodesCount(count: number) { |
||||
expect(await this.get().locator('.nc-erd-table-node').count()).toBe(count); |
||||
} |
||||
|
||||
async verifyEdgesCount({ |
||||
count, |
||||
circleCount, |
||||
rectangleCount, |
||||
}: { |
||||
count: number; |
||||
circleCount: number; |
||||
rectangleCount: number; |
||||
}) { |
||||
expect(await this.get().locator('.vue-flow__edge').count()).toBe(count); |
||||
expect(await this.get().locator('.nc-erd-edge-circle').count()).toBe(circleCount); |
||||
expect(await this.get().locator('.nc-erd-edge-rect').count()).toBe(rectangleCount); |
||||
} |
||||
|
||||
async verifyJunctionTableLabel({tableTitle, tableName}: {tableName: string; tableTitle: string}) { |
||||
expect(await this.vueFlow().locator(`.nc-erd-table-label-${tableTitle}-${tableName}`).locator('text')).toBeVisible(); |
||||
} |
||||
} |
@ -0,0 +1,373 @@
|
||||
import { test, expect } from "@playwright/test"; |
||||
import { mysqlSakilaSqlViews, mysqlSakilaTables, pgSakilaSqlViews, pgSakilaTables, sqliteSakilaSqlViews } from "./utils/sakila"; |
||||
import { DashboardPage } from "../pages/Dashboard"; |
||||
import { SettingsSubTab, SettingTab } from "../pages/Dashboard/Settings"; |
||||
import setup from "../setup"; |
||||
import { isMysql, isPg, isSqlite } from "../setup/db"; |
||||
import { GridPage } from "../pages/Dashboard/Grid"; |
||||
import { SettingsErdPage } from "../pages/Dashboard/Settings/Erd"; |
||||
|
||||
test.describe.only("Erd", () => { |
||||
let dashboard: DashboardPage; |
||||
let context: any; |
||||
let project: any; |
||||
let sakilaTables, sakilaSqlViews; |
||||
|
||||
test.beforeEach(async ({ page }) => { |
||||
context = await setup({ page }); |
||||
dashboard = new DashboardPage(page, context.project); |
||||
|
||||
project = context.project |
||||
if (isPg(context)) { |
||||
sakilaTables = pgSakilaTables; |
||||
sakilaSqlViews = pgSakilaSqlViews; |
||||
} else if(isMysql(context)) { |
||||
sakilaTables = mysqlSakilaTables; |
||||
sakilaSqlViews = mysqlSakilaSqlViews; |
||||
} else if(isSqlite(context)) { |
||||
sakilaTables = mysqlSakilaTables.map((tableName) => `${project.prefix}${tableName}`); |
||||
sakilaSqlViews = sqliteSakilaSqlViews.map((viewName) => `${project.prefix}${viewName}`); |
||||
} |
||||
}); |
||||
|
||||
// todo: Hack, edges are not getting rendered properly
|
||||
const openSettingsErdWithEdgesRendered = async () => { |
||||
await dashboard.gotoSettings(); |
||||
await dashboard.settings.selectTab({tab: SettingTab.ProjectMetadata, subTab: SettingsSubTab.Miscellaneous}); |
||||
await dashboard.settings.miscellaneous.clickShowM2MTables(); |
||||
|
||||
await dashboard.settings.selectSubTab({subTab: SettingsSubTab.ERD}); |
||||
// Todo: Otherwise edges wont be rendered
|
||||
await dashboard.rootPage.waitForTimeout(800); |
||||
await dashboard.settings.selectSubTab({subTab: SettingsSubTab.Miscellaneous}); |
||||
await dashboard.rootPage.waitForTimeout(800); |
||||
await dashboard.settings.selectSubTab({subTab: SettingsSubTab.ERD}); |
||||
|
||||
// Todo: Otherwise edges wont be rendered
|
||||
await dashboard.rootPage.waitForTimeout(200); |
||||
} |
||||
|
||||
// todo: remove this. Need for edges to be rendered
|
||||
const openErdOfATableWithEdgesRendered = async (tableName: string) => { |
||||
await dashboard.treeView.openTable({title: tableName}); |
||||
await dashboard.grid.toolbar.clickActions(); |
||||
await dashboard.rootPage.waitForTimeout(1000); |
||||
await dashboard.grid.toolbar.actions.click("ERD View"); |
||||
await dashboard.grid.toolbar.actions.erd.close(); |
||||
|
||||
await dashboard.treeView.openTable({title: 'Actor'}); |
||||
await dashboard.grid.toolbar.clickActions(); |
||||
await dashboard.rootPage.waitForTimeout(1000); |
||||
await dashboard.grid.toolbar.actions.click("ERD View"); |
||||
await dashboard.grid.toolbar.actions.erd.close(); |
||||
|
||||
await dashboard.treeView.openTable({title: tableName}); |
||||
await dashboard.grid.toolbar.clickActions(); |
||||
await dashboard.rootPage.waitForTimeout(1000); |
||||
await dashboard.grid.toolbar.actions.click("ERD View"); |
||||
} |
||||
|
||||
test("Verify default config, all columns disabled, only PK and FK disabled, Sql views and MM table option, junction table names", async () => { |
||||
await openSettingsErdWithEdgesRendered(); |
||||
|
||||
const erd: SettingsErdPage = dashboard.settings.erd; |
||||
|
||||
await erd.dbClickShowColumnNames(); |
||||
|
||||
if (isPg(context)) { |
||||
await erd.verifyNodesCount(mysqlSakilaTables.length); |
||||
await erd.verifyEdgesCount({ |
||||
count: 32, |
||||
circleCount: 29, |
||||
rectangleCount: 35, |
||||
}); |
||||
} else { |
||||
await erd.verifyNodesCount(mysqlSakilaTables.length); |
||||
await erd.verifyEdgesCount({ |
||||
count: 14, |
||||
circleCount: 11, |
||||
rectangleCount: 17, |
||||
}); |
||||
} |
||||
for(const tableName of sakilaTables) { |
||||
await erd.verifyNode({tableName}); |
||||
} |
||||
|
||||
// Verify Actor table
|
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}actor`, columns: actorTableColumn}); |
||||
|
||||
// Verify Payment table
|
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}payment`, columns: isPg(context) ? pgPaymentTableColumns : mysqlPaymentTableColumns}); |
||||
|
||||
// Disable show column names and pk/fk
|
||||
// todo: rerender edges, otherwise some edges wont be rendered
|
||||
await erd.clickShowColumnNames(); |
||||
await erd.clickShowJunctionTableNames(); |
||||
await erd.clickShowJunctionTableNames(); |
||||
|
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}actor`, columns: actorLTARColumns}); |
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}payment`, columns: paymentLTARColumns}); |
||||
|
||||
// Enable show column names and disable pk/fk
|
||||
await erd.clickShowColumnNames(); |
||||
await erd.clickShowPkAndFk(); |
||||
|
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}actor`, columns: actorNonPkFkColumns}); |
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}payment`, columns: isPg(context) ? pgPaymentNonPkFkColumns : paymentNonPkFkColumns}); |
||||
|
||||
await erd.clickShowPkAndFk(); |
||||
// Verify views
|
||||
await erd.clickShowSqlViews(); |
||||
if(isPg(context)) { |
||||
await erd.verifyNodesCount(sakilaTables.length + sakilaSqlViews.length); |
||||
await erd.verifyEdgesCount({ |
||||
count: 32, |
||||
circleCount: 29, |
||||
rectangleCount: 35, |
||||
}); |
||||
} else { |
||||
await erd.verifyNodesCount(sakilaTables.length + sakilaSqlViews.length); |
||||
await erd.verifyEdgesCount({ |
||||
count: 14, |
||||
circleCount: 11, |
||||
rectangleCount: 17, |
||||
}); |
||||
} |
||||
|
||||
for(const tableName of [...sakilaTables, ...sakilaSqlViews]) { |
||||
await erd.verifyNode({tableName}); |
||||
} |
||||
|
||||
// Verify ActorInfo SQL View
|
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}sales_by_store`, columns: salesByStoreColumns}); |
||||
|
||||
await erd.clickShowSqlViews(); // disable sql views
|
||||
|
||||
await erd.verifyNodeDoesNotExist({tableName: `${isSqlite(context) ? project.prefix: ''}store`}); |
||||
|
||||
// // Verify MM tables
|
||||
await erd.clickShowMMTables(); |
||||
await erd.clickShowJunctionTableNames(); |
||||
await erd.clickShowJunctionTableNames(); |
||||
|
||||
await erd.verifyNodesCount(isPg(context) ? 21: 16); |
||||
await erd.verifyEdgesCount({ |
||||
count: isPg(context) ? 44: 26, |
||||
circleCount: isPg(context) ? 40: 22, |
||||
rectangleCount: isPg(context) ? 48: 30, |
||||
}); |
||||
|
||||
await erd.verifyNode({tableName: `${isSqlite(context) ? project.prefix: ''}store`}); |
||||
|
||||
// Verify show junction table names
|
||||
await erd.clickShowJunctionTableNames(); |
||||
await erd.verifyJunctionTableLabel({tableName: `${isSqlite(context) ? project.prefix: ''}film_actor`, tableTitle: 'filmactor'}); |
||||
}); |
||||
|
||||
test("Verify ERD Table view, and verify column operations are reflected to the ERD view", async () => { |
||||
await openErdOfATableWithEdgesRendered("Country"); |
||||
const erd = dashboard.grid.toolbar.actions.erd; |
||||
|
||||
// Verify tables with default config
|
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}country`, columns: [ |
||||
'country_id', |
||||
'country', |
||||
'last_update', |
||||
'city_list' |
||||
]}); |
||||
|
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}city`, columns: [ |
||||
'city_id', |
||||
'city', |
||||
'country_id', |
||||
'last_update', |
||||
'country', |
||||
'address_list' |
||||
]}); |
||||
|
||||
// Verify with PK/FK disabled
|
||||
await erd.clickShowPkAndFk(); |
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}country`, columns: [ |
||||
'country', |
||||
'last_update', |
||||
'city_list' |
||||
]}); |
||||
|
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}city`, columns: [ |
||||
'city', |
||||
'last_update', |
||||
'country', |
||||
'address_list' |
||||
]}); |
||||
|
||||
// Verify with all columns disabled
|
||||
await erd.clickShowColumnNames(); |
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}country`, columns: [ |
||||
'city_list' |
||||
]}); |
||||
|
||||
await erd.verifyColumns({tableName: `${isSqlite(context) ? project.prefix: ''}city`, columns: [ |
||||
'country', |
||||
'address_list' |
||||
]}); |
||||
|
||||
// Enable All columns
|
||||
await erd.clickShowColumnNames(); |
||||
|
||||
await erd.close(); |
||||
|
||||
// Add column
|
||||
await dashboard.grid.column.create({title: "test_column"}); |
||||
// Verify in Settings ERD and table ERD
|
||||
await openSettingsErdWithEdgesRendered(); |
||||
await dashboard.settings.erd.verifyNode({tableName: `${isSqlite(context) ? project.prefix: ''}country`, columnName: 'test_column'}); |
||||
await dashboard.settings.close(); |
||||
|
||||
await dashboard.treeView.openTable({title: "Country"}); |
||||
await dashboard.grid.toolbar.clickActions(); |
||||
await dashboard.rootPage.waitForTimeout(1000); |
||||
await dashboard.grid.toolbar.actions.click("ERD View"); |
||||
await dashboard.grid.toolbar.actions.erd.verifyNode({tableName: `${isSqlite(context) ? project.prefix: ''}country`, columnName: 'test_column'}); |
||||
await dashboard.grid.toolbar.actions.erd.close(); |
||||
|
||||
// Update column
|
||||
await dashboard.grid.column.openEdit({ title: "test_column" }); |
||||
await dashboard.grid.column.fillTitle({ title: "new_test_column" }); |
||||
await dashboard.grid.column.save({ |
||||
isUpdated: true, |
||||
}); |
||||
// Verify in Settings ERD and table ERD
|
||||
await openSettingsErdWithEdgesRendered(); |
||||
await dashboard.settings.erd.verifyNode({tableName: `${isSqlite(context) ? project.prefix: ''}country`, columnName: 'new_test_column'}); |
||||
await dashboard.settings.close(); |
||||
|
||||
await dashboard.treeView.openTable({title: "Country"}); |
||||
await dashboard.grid.toolbar.clickActions(); |
||||
await dashboard.rootPage.waitForTimeout(1000); |
||||
await dashboard.grid.toolbar.actions.click("ERD View"); |
||||
await dashboard.grid.toolbar.actions.erd.verifyNode({tableName: `${isSqlite(context) ? project.prefix: ''}country`, columnName: 'new_test_column'}); |
||||
await dashboard.grid.toolbar.actions.erd.close(); |
||||
|
||||
// Delete column
|
||||
await dashboard.grid.column.delete({title: "new_test_column"}); |
||||
// Verify in Settings ERD and table ERD
|
||||
await openSettingsErdWithEdgesRendered(); |
||||
await dashboard.settings.erd.verifyNode({ |
||||
tableName: `${isSqlite(context) ? project.prefix: ''}country`,
|
||||
columnNameShouldNotExist: 'new_test_column' |
||||
}); |
||||
await dashboard.settings.close(); |
||||
}) |
||||
|
||||
test("Verify table operations sync with ERD", async () => { |
||||
await openSettingsErdWithEdgesRendered(); |
||||
await dashboard.settings.close() |
||||
|
||||
await dashboard.treeView.openTable({title: "Country"}); |
||||
await dashboard.grid.toolbar.clickActions(); |
||||
await dashboard.rootPage.waitForTimeout(1000); |
||||
await dashboard.grid.toolbar.actions.click("ERD View"); |
||||
await dashboard.grid.toolbar.actions.erd.verifyNode({ |
||||
tableName: `${isSqlite(context) ? project.prefix: ''}country`,
|
||||
columnNameShouldNotExist: 'new_test_column' |
||||
}); |
||||
await dashboard.grid.toolbar.actions.erd.close(); |
||||
|
||||
// Create table and verify ERD
|
||||
await dashboard.treeView.createTable({title: "Test"}); |
||||
// Verify in Settings ERD and table ERD
|
||||
await openSettingsErdWithEdgesRendered(); |
||||
await dashboard.settings.erd.verifyNode({ |
||||
tableName: `${isSqlite(context) ? project.prefix: ''}Test`,
|
||||
}); |
||||
await dashboard.settings.close(); |
||||
|
||||
// Delete table and verify ERD
|
||||
await dashboard.treeView.deleteTable({title: "Test"}); |
||||
await openSettingsErdWithEdgesRendered(); |
||||
await dashboard.settings.erd.verifyNodeDoesNotExist({ |
||||
tableName: `${isSqlite(context) ? project.prefix: ''}Test`,
|
||||
}); |
||||
|
||||
// Verify that `show mm table` option disabled will not trigger easter in ERD options
|
||||
await dashboard.settings.selectSubTab({subTab: SettingsSubTab.Miscellaneous}); |
||||
await dashboard.settings.miscellaneous.clickShowM2MTables(); // disable
|
||||
await dashboard.settings.selectSubTab({subTab: SettingsSubTab.ERD}); |
||||
await dashboard.settings.erd.dbClickShowColumnNames(); |
||||
await dashboard.settings.erd.verifyEasterEggNotShown(); |
||||
await dashboard.settings.close(); |
||||
}) |
||||
|
||||
}); |
||||
|
||||
|
||||
|
||||
const actorTableColumn = [ |
||||
'actor_id', |
||||
'first_name', |
||||
'last_name', |
||||
'last_update', |
||||
'film_list' |
||||
] |
||||
|
||||
const mysqlPaymentTableColumns = [ |
||||
'payment_id', |
||||
'customer_id', |
||||
'staff_id', |
||||
'rental_id', |
||||
'amount', |
||||
'payment_date', |
||||
'last_update', |
||||
'customer', |
||||
'rental', |
||||
'staff' |
||||
] |
||||
|
||||
const pgPaymentTableColumns = [ |
||||
'payment_id', |
||||
'customer_id', |
||||
'staff_id', |
||||
'rental_id', |
||||
'amount', |
||||
'payment_date', |
||||
'customer', |
||||
'rental', |
||||
'staff' |
||||
] |
||||
|
||||
const actorLTARColumns = [ |
||||
'filmactor_list', |
||||
'film_list' |
||||
]; |
||||
|
||||
const actorNonPkFkColumns = [ |
||||
'first_name', |
||||
'last_name', |
||||
'last_update', |
||||
'film_list', |
||||
'filmactor_list' |
||||
]; |
||||
|
||||
const paymentLTARColumns = [ |
||||
'customer', |
||||
'rental', |
||||
'staff' |
||||
]; |
||||
|
||||
const pgPaymentNonPkFkColumns = [ |
||||
'amount', |
||||
'payment_date', |
||||
'customer', |
||||
'rental', |
||||
'staff' |
||||
]; |
||||
const paymentNonPkFkColumns = [ |
||||
...pgPaymentNonPkFkColumns, |
||||
'last_update' |
||||
]; |
||||
|
||||
const salesByStoreColumns = [ |
||||
'store', |
||||
'manager', |
||||
'total_sales' |
||||
]; |
@ -0,0 +1,21 @@
|
||||
const mysqlSakilaTables = [ |
||||
'actor', 'address', 'category', 'city', 'country', 'customer', 'film', 'film_text', 'language', 'payment', 'rental', 'staff' |
||||
] |
||||
|
||||
const mysqlSakilaSqlViews = [ |
||||
'actor_info', 'customer_list', 'film_list', 'nicer_but_slower_film_list', 'sales_by_film_category', 'sales_by_store', 'staff_list' |
||||
] |
||||
|
||||
const pgSakilaTables = [ |
||||
'actor', 'address', 'category', 'city', 'country', 'customer', 'film', 'language', 'payment', 'payment_p2007_01', 'payment_p2007_02', 'payment_p2007_03', 'payment_p2007_04', 'payment_p2007_05', 'payment_p2007_06', 'rental', 'staff' |
||||
] |
||||
|
||||
const pgSakilaSqlViews = [ |
||||
'actor_info', 'customer_list', 'film_list', 'nicer_but_slower_film_list', 'sales_by_film_category', 'sales_by_store', 'staff_list' |
||||
] |
||||
|
||||
const sqliteSakilaSqlViews = [ |
||||
'customer_list', 'film_list', 'staff_list', 'sales_by_store', 'sales_by_film_category' |
||||
] |
||||
|
||||
export { mysqlSakilaTables, mysqlSakilaSqlViews, pgSakilaTables, pgSakilaSqlViews, sqliteSakilaSqlViews } |
Loading…
Reference in new issue