@@ -84,6 +84,96 @@ ClassMethod ExcuteCode(code As %Stream.Object, variable As %String = "") As %Sta
84
84
quit sc
85
85
}
86
86
87
+ /// Populate variable from sql query
88
+ /// variable - python variable to set
89
+ /// type - variable type (Currently supported: dataframe (pandas dataframe) and list.
90
+ /// query - text of the SQL query
91
+ /// set sc = ##class(isc.py.Main).ExecuteQuery("SELECT * FROM isc_py_test.CannibalizationData", "df")
92
+ ClassMethod ExecuteQuery (query As %String , variable , type As %String (VALUELIST =" ,dataframe,list" ) = " list" ) As %Status
93
+ {
94
+ #include %occODBC
95
+ #dim sc As %Status = $$$OK
96
+ quit :" ,dataframe,list" '[type $$$ERROR($$$GeneralError, " Invalid type: " _ $g (type ) _ " . Expected types: dataframe or list" )
97
+
98
+ if type =" dataframe" {
99
+ set sc = ..ImportModule (" pandas" , , .pandas )
100
+ quit :$$$ISERR(sc ) sc
101
+ }
102
+
103
+ /// Really %sqlcq.<NAMESPACE>.cls<NUMBER>
104
+ #dim result As %SQL.ISelectResult
105
+ set result = ##class (%SQL.Statement ).%ExecDirect (,query )
106
+
107
+ set start = $zh
108
+ #dim metadata As SQL.StatementMetadata
109
+ set metadata = result .%GetMetadata ()
110
+ set columnCount = metadata .columns .Count ()
111
+
112
+ set columnList = " "
113
+ for i =1 :1 :columnCount {
114
+ #dim column As %SQL.StatementColumn
115
+ set column = metadata .columns .GetAt (i )
116
+
117
+ set class (i ) = $lb (column .colName )
118
+ if column .IsNumeric () {
119
+ set class (i ) = class (i ) _ $lb (" numeric" )
120
+ } elseif ((column .ODBCType =$$$ODBCTYPEtimestamp) || (column .ODBCType =$$$ODBCTYPEdate)) {
121
+ set class (i ) = class (i ) _ $lb (" date" )
122
+ } elseif column .ODBCType = $$$ODBCTYPEtime {
123
+ set class (i ) = class (i ) _ $lb (" time" )
124
+ } else {
125
+ set class (i ) = class (i ) _ $lb (" string" )
126
+ }
127
+
128
+ set columnList = columnList _ $lb (" '" _ column .colName _ " '" )
129
+ }
130
+
131
+ // zzzcolumns = ['col1', 'col2', 'col3']
132
+ if type =" dataframe" {
133
+ set code = " zzzcolumns=[" _ $lts (columnList , " ," ) _ " ]"
134
+ } elseif type =" list" {
135
+ set code = " zzzcolumns=[(" _ $lts (columnList , " ," ) _ " )]"
136
+ }
137
+ set sc = ..SimpleString (code )
138
+ quit :$$$ISERR(sc ) sc
139
+
140
+ set data = ##class (%Stream.GlobalCharacter ).%New ()
141
+ do data .Write (" [" )
142
+
143
+ set first = $$$YES
144
+ while result .%Next () {
145
+ // TODO get isLastRow in a sane way
146
+ if first {
147
+ set first = $$$NO
148
+ } else {
149
+ do data .Write (" ," )
150
+ }
151
+ set rowList = " "
152
+ for i =1 :1 :columnCount {
153
+ set value = result .%GetData (i )
154
+ set :$lv (value ) value = $lts (value )
155
+ set rowList = rowList _ $lb (" '" _ value _ " '" )
156
+ }
157
+ do data .Write (" (" _ $lts (rowList , " ," ) _ " )" )
158
+
159
+ }
160
+ do data .Write (" ]" )
161
+
162
+ set sc = ..ExcuteCode (data , " zzzdata" )
163
+ quit :$$$ISERR(sc ) sc
164
+
165
+ if type =" dataframe" {
166
+ set sc = ..SimpleString (variable _ " =" _ pandas _ " .DataFrame(zzzdata, columns=zzzcolumns)" )
167
+ } elseif type =" list" {
168
+ set sc = ..SimpleString (variable _ " = zzzcolumns + zzzdata" )
169
+ }
170
+ do ..SimpleString (" del zzzdata, zzzcolumns" )
171
+
172
+ set end = $zh
173
+ write " Time: " , end -start ,!
174
+ quit sc
175
+ }
176
+
87
177
/// variable - variable name
88
178
/// useString - if variable length is less than $$$MaxStringLength, return string instead of stream. Ignored if variable length is more than $$$MaxStringLength
89
179
/// set sc = ##class(isc.py.Main).GetVariable()
0 commit comments