Skip to content

Commit 538596c

Browse files
committed
duckdb imprevements
1 parent 8eef2c4 commit 538596c

File tree

2 files changed

+46
-18
lines changed

2 files changed

+46
-18
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -296,10 +296,10 @@ session2 = noteql.Session('postgresql://user:password@localhost/dbname')
296296
%nql SELECT 1;
297297
```
298298

299-
To swap between sessions you can `use` on the session you want:
299+
To swap between sessions you can `set` on the session you want:
300300

301301
```python
302-
session.use()
302+
session.set()
303303
```
304304
or use the `SESSION` command:
305305

noteql/__init__.py

+44-16
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
def get_engine(dburi, connect_args=None):
3535
if not dburi:
3636
dburi = os.environ.get("NOTEQL_DBURI")
37-
return sqlalchemy.create_engine(dburi, connect_args=connect_args or {})
37+
return sqlalchemy.create_engine(str(dburi), connect_args=connect_args or {})
3838

3939

4040
def generate_rows(result, limit):
@@ -203,7 +203,7 @@ def set(self):
203203
connection = self.datasette_url
204204
else:
205205
connection = self.dburi
206-
if self.engine.url.password:
206+
if self.engine.url.password and connection:
207207
connection = connection.replace(self.engine.url.password, '***')
208208

209209
print(
@@ -244,21 +244,39 @@ def create_view(self, view, sql, params=None):
244244
return self.create_relation(view, sql, "VIEW", params)
245245

246246
def create_relation(self, relation, sql, type, params=None):
247-
self.run_sql(
248-
"""
249-
DROP {type} IF EXISTS {relation};
250-
""".format(
251-
relation=relation, type=type
247+
if not (self.database_type == 'duckdb' and relation.startswith("'")):
248+
self.run_sql(
249+
"""
250+
DROP {type} IF EXISTS {relation};
251+
""".format(
252+
relation=relation, type=type
253+
)
252254
)
253-
)
254255

255-
sql = """
256-
CREATE {type} {relation}
257-
AS
258-
{sql}
259-
""".format(
260-
relation=relation, sql=sql, type=type
261-
)
256+
sql = """
257+
CREATE {type} {relation}
258+
AS
259+
{sql}
260+
""".format(
261+
relation=relation, sql=sql, type=type
262+
)
263+
else:
264+
if relation.endswith(".csv'"):
265+
sql = """
266+
COPY (
267+
{sql}
268+
) TO {relation} with (HEADER 1)
269+
""".format(
270+
relation=relation, sql=sql
271+
)
272+
else:
273+
sql = """
274+
COPY (
275+
{sql}
276+
) TO {relation}
277+
""".format(
278+
relation=relation, sql=sql
279+
)
262280
return self.run_sql(sql, params=params)
263281

264282
def get_dataframe(
@@ -583,7 +601,9 @@ def get_parsers(self, noteql_session):
583601
create = pp.Keyword("create", caseless=True).suppress() + (
584602
pp.Word(pp.alphanums + "_")
585603
| pp.QuotedString('"', escQuote='"', unquoteResults=False)
604+
| pp.QuotedString("'", escQuote="'", unquoteResults=False)
586605
)("create")
606+
587607
view = pp.Keyword("view", caseless=True).suppress() + (
588608
pp.Word(pp.alphanums + "_")
589609
| pp.QuotedString('"', escQuote='"', unquoteResults=False)
@@ -670,6 +690,8 @@ def execute_part(self, parsed_line, sql):
670690
ns = self.shell.user_ns
671691

672692
session = self.find_session()
693+
if not session:
694+
return
673695

674696
actions = {}
675697
arg_params = {}
@@ -857,14 +879,20 @@ def execute_part(self, parsed_line, sql):
857879
view_name = actions.get("view")
858880

859881
if view_name:
860-
session.create_view(view_name, sql, params)
882+
if create_name:
883+
session.create_view(view_name, f"select * from {create_name}")
884+
else:
885+
session.create_view(view_name, sql, params)
861886

862887
return df
863888

864889
@line_cell_magic
865890
def nql(self, line, cell=None):
866891

867892
session = self.find_session()
893+
if not session:
894+
return
895+
868896
if cell:
869897
dfs = []
870898
magic_line_parser, cell_parser = self.get_parsers(session)

0 commit comments

Comments
 (0)