docs(duckdb-wasm|drizzle-duckdb-wasm): added documentations and descriptions
This commit is contained in:
@@ -17,25 +17,25 @@ npm i @proj-airi/duckdb-wasm -D
|
||||
|
||||
### Browser
|
||||
|
||||
```vue
|
||||
```html
|
||||
<script setup lang="ts">
|
||||
import type { DuckDBWasmClient } from '@proj-airi/duckdb-wasm'
|
||||
import type { DuckDBWasmClient } from '@proj-airi/duckdb-wasm'
|
||||
|
||||
import { connect, getEnvironment } from '@proj-airi/duckdb-wasm'
|
||||
import { getImportUrlBundles } from '@proj-airi/duckdb-wasm/bundles/import-url-browser'
|
||||
import { onMounted, onUnmounted, ref } from 'vue'
|
||||
import { connect, getEnvironment } from '@proj-airi/duckdb-wasm'
|
||||
import { getImportUrlBundles } from '@proj-airi/duckdb-wasm/bundles/import-url-browser'
|
||||
import { onMounted, onUnmounted, ref } from 'vue'
|
||||
|
||||
const db = ref<DuckDBWasmClient>()
|
||||
const db = ref<DuckDBWasmClient>()
|
||||
|
||||
onMounted(async () => {
|
||||
db.value = await connect({ bundles: getImportUrlBundles })
|
||||
const result = await db.value.conn.query('SELECT 1 + 1 AS res')
|
||||
console.log(result) // Output: [{ res: 2 }]
|
||||
})
|
||||
onMounted(async () => {
|
||||
db.value = await connect({ bundles: getImportUrlBundles })
|
||||
const result = await db.value.conn.query('SELECT 1 + 1 AS res')
|
||||
console.log(result) // Output: [{ res: 2 }]
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
db.value?.close()
|
||||
})
|
||||
onUnmounted(() => {
|
||||
db.value?.close()
|
||||
})
|
||||
</script>
|
||||
```
|
||||
|
||||
@@ -62,3 +62,7 @@ async function main() {
|
||||
await close()
|
||||
}
|
||||
```
|
||||
|
||||
## Footnotes
|
||||
|
||||
Check out the [Drizzle ORM driver](https://github.com/moeru-ai/airi/blob/main/packages/drizzle-duckdb-wasm/README.md) we made for `@duckdb/duckdb-wasm` as welL!
|
||||
|
||||
@@ -36,6 +36,4 @@ export async function getEnvironment() {
|
||||
catch {
|
||||
return 'unknown'
|
||||
}
|
||||
|
||||
return 'unknown'
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import { AsyncDuckDB, ConsoleLogger, selectBundle, VoidLogger } from '@duckdb/du
|
||||
import { defu } from 'defu'
|
||||
|
||||
import { getEnvironment } from './common'
|
||||
import { mapStructRowData } from './format'
|
||||
|
||||
export type ConnectOptions = ConnectRequiredOptions & ConnectOptionalOptions
|
||||
|
||||
@@ -21,6 +22,7 @@ export interface DuckDBWasmClient {
|
||||
db: AsyncDuckDB
|
||||
conn: AsyncDuckDBConnection
|
||||
close: () => Promise<void>
|
||||
query: (string, params?: unknown[]) => Promise<Record<string, unknown>[]>
|
||||
}
|
||||
|
||||
export async function connect(options: ConnectOptions): Promise<DuckDBWasmClient> {
|
||||
@@ -79,6 +81,19 @@ export async function connect(options: ConnectOptions): Promise<DuckDBWasmClient
|
||||
worker,
|
||||
db,
|
||||
conn,
|
||||
query: async (query: string, params: unknown[] = []) => {
|
||||
if (!params || params.length === 0) {
|
||||
const results = await conn.query(query)
|
||||
return mapStructRowData(results)
|
||||
}
|
||||
|
||||
const stmt = await conn.prepare(query)
|
||||
const results = await stmt.query(...params)
|
||||
const rows = mapStructRowData(results)
|
||||
|
||||
stmt.close()
|
||||
return rows
|
||||
},
|
||||
close: async () => {
|
||||
await conn.close()
|
||||
await db.terminate()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { TZDate } from '@date-fns/tz'
|
||||
import type { Field, StructRow } from 'apache-arrow'
|
||||
import type { Field, Schema, StructRow } from 'apache-arrow'
|
||||
import type { DataType } from './types'
|
||||
|
||||
import { TZDateMini } from '@date-fns/tz'
|
||||
@@ -605,3 +605,17 @@ export function mapColumnData<T = unknown>(x: DataType, field?: Field): T {
|
||||
|
||||
return String(x) as T
|
||||
}
|
||||
|
||||
export function mapStructRowData<T extends { toArray: () => StructRow[], schema: Schema }>(results: T) {
|
||||
const rows = (results.toArray() as StructRow[] || []).map(item => item.toJSON()) || []
|
||||
|
||||
const jsRepresentedRows = rows.map((row) => {
|
||||
results.schema.fields.forEach((field) => {
|
||||
return row[field.name] = mapColumnData(row[field.name], field)
|
||||
})
|
||||
|
||||
return row
|
||||
})
|
||||
|
||||
return jsRepresentedRows
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user