|
34 | 34 | def get_engine(dburi, connect_args=None):
|
35 | 35 | if not dburi:
|
36 | 36 | 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 {}) |
38 | 38 |
|
39 | 39 |
|
40 | 40 | def generate_rows(result, limit):
|
@@ -203,7 +203,7 @@ def set(self):
|
203 | 203 | connection = self.datasette_url
|
204 | 204 | else:
|
205 | 205 | connection = self.dburi
|
206 |
| - if self.engine.url.password: |
| 206 | + if self.engine.url.password and connection: |
207 | 207 | connection = connection.replace(self.engine.url.password, '***')
|
208 | 208 |
|
209 | 209 | print(
|
@@ -244,21 +244,39 @@ def create_view(self, view, sql, params=None):
|
244 | 244 | return self.create_relation(view, sql, "VIEW", params)
|
245 | 245 |
|
246 | 246 | 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 | + ) |
252 | 254 | )
|
253 |
| - ) |
254 | 255 |
|
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 | + ) |
262 | 280 | return self.run_sql(sql, params=params)
|
263 | 281 |
|
264 | 282 | def get_dataframe(
|
@@ -583,7 +601,9 @@ def get_parsers(self, noteql_session):
|
583 | 601 | create = pp.Keyword("create", caseless=True).suppress() + (
|
584 | 602 | pp.Word(pp.alphanums + "_")
|
585 | 603 | | pp.QuotedString('"', escQuote='"', unquoteResults=False)
|
| 604 | + | pp.QuotedString("'", escQuote="'", unquoteResults=False) |
586 | 605 | )("create")
|
| 606 | + |
587 | 607 | view = pp.Keyword("view", caseless=True).suppress() + (
|
588 | 608 | pp.Word(pp.alphanums + "_")
|
589 | 609 | | pp.QuotedString('"', escQuote='"', unquoteResults=False)
|
@@ -670,6 +690,8 @@ def execute_part(self, parsed_line, sql):
|
670 | 690 | ns = self.shell.user_ns
|
671 | 691 |
|
672 | 692 | session = self.find_session()
|
| 693 | + if not session: |
| 694 | + return |
673 | 695 |
|
674 | 696 | actions = {}
|
675 | 697 | arg_params = {}
|
@@ -857,14 +879,20 @@ def execute_part(self, parsed_line, sql):
|
857 | 879 | view_name = actions.get("view")
|
858 | 880 |
|
859 | 881 | 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) |
861 | 886 |
|
862 | 887 | return df
|
863 | 888 |
|
864 | 889 | @line_cell_magic
|
865 | 890 | def nql(self, line, cell=None):
|
866 | 891 |
|
867 | 892 | session = self.find_session()
|
| 893 | + if not session: |
| 894 | + return |
| 895 | + |
868 | 896 | if cell:
|
869 | 897 | dfs = []
|
870 | 898 | magic_line_parser, cell_parser = self.get_parsers(session)
|
|
0 commit comments