Hello, The outstyle configuration option is for kamcli, inside kamcli.ini file.
I just tested with sqlite and empty subscriber table: # kamcli -c ../kamcli-sqlite.ini subscriber show +------+------------+----------+------------+-------+--------+ | id | username | domain | password | ha1 | ha1b | +======+============+==========+============+=======+========+ +------+------------+----------+------------+-------+--------+ Added a user: kamcli -c ../kamcli-sqlite.ini subscriber add test password Then listed: kamcli -c ../kamcli-sqlite.ini subscriber show +------+------------+----------+------------+----------------------------------+----------------------------------+ | id | username | domain | password | ha1 | ha1b | +======+============+==========+============+==================================+==================================+ | 1 | test | test.com | password | 30e725cfc53ca50516be2e230edf53da | a04fcbbe67702c59dc46fe4779183fe5 | +------+------------+----------+------------+----------------------------------+----------------------------------+ I have tabulate 0.8.5 running on Debian 10, kamcli in virtual environment. Cheers, Daniel On 22.04.21 09:25, beer Ll wrote: > Hi Daniel > > > On Thu, Apr 22, 2021 at 8:57 AM Daniel-Constantin Mierla > <mico...@gmail.com <mailto:mico...@gmail.com>> wrote: > > Hello, > > at least some of the new errors are not the same, they are related > to unique key conflict, see the bottom of the traces: > > sqlite3.IntegrityError: UNIQUE constraint failed: > subscriber.username, subscriber.domain > > sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE > constraint failed: subscriber.username, subscriber.domain > [SQL: insert into subscriber (username, domain, password, ha1, > ha1b) values ('test', 'sip.test.dev <http://sip.test.dev>', > 'passwordtest', '96a1efd95bcd6e8e573d07ebdacab623', > '025f1dc363fa8c1ce1d7f2069d94ed0f')] > > Regarding the subscriber show command, do you have any outstyle > configuration option set? > > What is the version of your tabulate package? > > > sqlite> .show > echo: off > eqp: off > explain: auto > headers: off > mode: list > nullvalue: "" > output: stdout > colseparator: "|" > rowseparator: "\n" > stats: off > width: > filename: /etc/kamailio/kamailio.db > > (venv) kamailio-BT:/usr/src/kamclienv # pip3 show tabulate > Name: tabulate > Version: 0.8.9 > Summary: Pretty-print tabular data > Home-page: https://github.com/astanin/python-tabulate > <https://github.com/astanin/python-tabulate> > Author: Sergey Astanin > Author-email: s.asta...@gmail.com <mailto:s.asta...@gmail.com> > License: MIT > Location: /usr/src/kamclienv/venv/lib/python3.7/site-packages > Requires: > Required-by: kamcli > > > regards > > > Cheers, > Daniel > > On 21.04.21 23:24, beer Ll wrote: >> Hi Daniel >> many thanks for yours commits in git kamcli. >> >> I try the new version but my errors are the same >> >> (venv) kamailio-BT:/usr/src/kamclienv/kamcli # kamcli -c >> /etc/kamcli/kamcli.ini.sqlite subscriber show >> Traceback (most recent call last): >> File "/usr/src/kamclienv/venv/bin/kamcli", line 33, in <module> >> sys.exit(load_entry_point('kamcli', 'console_scripts', >> 'kamcli')()) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 829, in __call__ >> return self.main(*args, **kwargs) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 782, in main >> rv = self.invoke(ctx) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 1259, in invoke >> return _process_result(sub_ctx.command.invoke(sub_ctx)) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 1259, in invoke >> return _process_result(sub_ctx.command.invoke(sub_ctx)) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 1066, in invoke >> return ctx.invoke(self.callback, **ctx.params) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 610, in invoke >> return callback(*args, **kwargs) >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/decorators.py", >> line 73, in new_func >> return ctx.invoke(f, obj, *args, **kwargs) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 610, in invoke >> return callback(*args, **kwargs) >> File >> "/usr/src/kamclienv/kamcli/kamcli/commands/cmd_subscriber.py", >> line 235, in subscriber_show >> ioutils_dbres_print(ctx, oformat, ostyle, res) >> File "/usr/src/kamclienv/kamcli/kamcli/ioutils.py", line 70, in >> ioutils_dbres_print >> gstring = tabulate(allrows, headers=res.keys(), tablefmt=ostyle) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/tabulate.py", >> line 1529, in tabulate >> tabular_data, headers, showindex=showindex >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/tabulate.py", >> line 1162, in _normalize_tabular_data >> "headers for a list of dicts is not a dict or a keyword" >> ValueError: headers for a list of dicts is not a dict or a keyword >> (venv) kamailio-BT:/usr/src/kamclienv/kamcli # kamcli -c >> /etc/kamcli/kamcli.ini.sqlite subscriber add test passwordtest >> Traceback (most recent call last): >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", >> line 1706, in _execute_context >> cursor, statement, parameters, context >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", >> line 716, in do_execute >> cursor.execute(statement, parameters) >> sqlite3.IntegrityError: UNIQUE constraint failed: >> subscriber.username, subscriber.domain >> >> The above exception was the direct cause of the following exception: >> >> Traceback (most recent call last): >> File "/usr/src/kamclienv/venv/bin/kamcli", line 33, in <module> >> sys.exit(load_entry_point('kamcli', 'console_scripts', >> 'kamcli')()) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 829, in __call__ >> return self.main(*args, **kwargs) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 782, in main >> rv = self.invoke(ctx) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 1259, in invoke >> return _process_result(sub_ctx.command.invoke(sub_ctx)) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 1259, in invoke >> return _process_result(sub_ctx.command.invoke(sub_ctx)) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 1066, in invoke >> return ctx.invoke(self.callback, **ctx.params) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 610, in invoke >> return callback(*args, **kwargs) >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/decorators.py", >> line 73, in new_func >> return ctx.invoke(f, obj, *args, **kwargs) >> File >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/click/core.py", >> line 610, in invoke >> return callback(*args, **kwargs) >> File >> "/usr/src/kamclienv/kamcli/kamcli/commands/cmd_subscriber.py", >> line 69, in subscriber_add >> ha1b, >> File "<string>", line 2, in execute >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/sqlalchemy/util/deprecations.py", >> line 390, in warned >> return fn(*args, **kwargs) >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", >> line 3037, in execute >> return connection.execute(statement, *multiparams, **params) >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", >> line 1190, in execute >> future=False, >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", >> line 1491, in _exec_driver_sql >> distilled_parameters, >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", >> line 1749, in _execute_context >> e, statement, parameters, cursor, context >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", >> line 1930, in _handle_dbapi_exception >> sqlalchemy_exception, with_traceback=exc_info[2], from_=e >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", >> line 211, in raise_ >> raise exception >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", >> line 1706, in _execute_context >> cursor, statement, parameters, context >> File >> >> "/usr/src/kamclienv/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", >> line 716, in do_execute >> cursor.execute(statement, parameters) >> sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE >> constraint failed: subscriber.username, subscriber.domain >> [SQL: insert into subscriber (username, domain, password, ha1, >> ha1b) values ('test', 'sip.test.dev <http://sip.test.dev>', >> 'passwordtest', '96a1efd95bcd6e8e573d07ebdacab623', >> '025f1dc363fa8c1ce1d7f2069d94ed0f')] >> (Background on this error at: http://sqlalche.me/e/14/gkpj >> <http://sqlalche.me/e/14/gkpj>) >> >> best regards >> >> On Wed, Apr 21, 2021 at 3:10 PM Daniel-Constantin Mierla >> <mico...@gmail.com <mailto:mico...@gmail.com>> wrote: >> >> Hello, >> >> On 18.04.21 22:56, beer Ll wrote: >>> Hi , >>> >>> I have a server test with >>> >>> Debian Buster 10.9 >>> kamailio 5.4.5 >>> kamcli 2.0.0 (similar result with 3.0.0) >>> >>> I'm not able to use kamcli >>> with sqlite : insert and select doesn't work >>> with pgsql : insert works , select of empty table works , >>> select table with entry doesn't work >>> >>> >>> TEST WITH SQLITE >>> root@kamailio-BT:~# kamcli -c /etc/kamcli/kamcli.ini.sqlite >>> subscriber add test password >>> Traceback (most recent call last): >>> File >>> "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/base.py", >>> line 1706, in _execute_context >>> cursor, statement, parameters, context >>> File >>> >>> "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/default.py", >>> line 716, in do_execute >>> cursor.execute(statement, parameters) >>> sqlite3.OperationalError: near "%": syntax error >>> >>> The above exception was the direct cause of the following >>> exception: >>> >>> Traceback (most recent call last): >>> File "/usr/bin/kamcli", line 11, in <module> >>> load_entry_point('kamcli==2.0.0', 'console_scripts', >>> 'kamcli')() >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 829, in __call__ >>> return self.main(*args, **kwargs) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 782, in main >>> rv = self.invoke(ctx) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 1259, in invoke >>> return _process_result(sub_ctx.command.invoke(sub_ctx)) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 1259, in invoke >>> return _process_result(sub_ctx.command.invoke(sub_ctx)) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 1066, in invoke >>> return ctx.invoke(self.callback, **ctx.params) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 610, in invoke >>> return callback(*args, **kwargs) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/decorators.py", >>> line 73, in new_func >>> return ctx.invoke(f, obj, *args, **kwargs) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 610, in invoke >>> return callback(*args, **kwargs) >>> File >>> "/usr/lib/python3/dist-packages/kamcli/commands/cmd_subscriber.py", >>> line 43, in subscriber_add >>> e.execute('insert into subscriber (username, domain, >>> password, ha1, ha1b) values (%s, %s, %s, %s, %s)', >>> udata['username'], udata['domain'], password, ha1, ha1b) >>> File "<string>", line 2, in execute >>> File >>> >>> "/usr/local/lib/python3.7/dist-packages/sqlalchemy/util/deprecations.py", >>> line 390, in warned >>> return fn(*args, **kwargs) >>> File >>> "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/base.py", >>> line 3037, in execute >>> return connection.execute(statement, *multiparams, **params) >>> File >>> "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/base.py", >>> line 1190, in execute >>> future=False, >>> File >>> "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/base.py", >>> line 1491, in _exec_driver_sql >>> distilled_parameters, >>> File >>> "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/base.py", >>> line 1749, in _execute_context >>> e, statement, parameters, cursor, context >>> File >>> "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/base.py", >>> line 1930, in _handle_dbapi_exception >>> sqlalchemy_exception, with_traceback=exc_info[2], from_=e >>> File >>> "/usr/local/lib/python3.7/dist-packages/sqlalchemy/util/compat.py", >>> line 211, in raise_ >>> raise exception >>> File >>> "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/base.py", >>> line 1706, in _execute_context >>> cursor, statement, parameters, context >>> File >>> >>> "/usr/local/lib/python3.7/dist-packages/sqlalchemy/engine/default.py", >>> line 716, in do_execute >>> cursor.execute(statement, parameters) >>> sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) >>> near "%": syntax error >>> [SQL: insert into subscriber (username, domain, password, >>> ha1, ha1b) values (%s, %s, %s, %s, %s)] >>> [parameters: ('test', 'sip.test.dev <http://sip.test.dev>', >>> 'password', '4380ea9069e888b5fc92996495a0f481', >>> '3a36aeb0df7f4504cc5d9b97dab540e5')] >>> (Background on this error at: http://sqlalche.me/e/14/e3q8 >>> <http://sqlalche.me/e/14/e3q8>) >>> >>> root@kamailio-BT:~# kamctl add test password >>> -e sqlite_query: /usr/bin/sqlite3 /etc/kamailio/kamailio.db >>> insert into subscriber (username, domain,ha1,ha1b,password) >>> values ('test','sip.test.dev >>> >>> <http://sip.test.dev>','4380ea9069e888b5fc92996495a0f481','3a36aeb0df7f4504cc5d9b97dab540e5','password'); >>> -e new user 'test' added >>> >>> root@kamailio-BT:~# kamcli -c /etc/kamcli/kamcli.ini.sqlite >>> subscriber show >>> Traceback (most recent call last): >>> File "/usr/bin/kamcli", line 11, in <module> >>> load_entry_point('kamcli==2.0.0', 'console_scripts', >>> 'kamcli')() >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 829, in __call__ >>> return self.main(*args, **kwargs) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 782, in main >>> rv = self.invoke(ctx) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 1259, in invoke >>> return _process_result(sub_ctx.command.invoke(sub_ctx)) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 1259, in invoke >>> return _process_result(sub_ctx.command.invoke(sub_ctx)) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 1066, in invoke >>> return ctx.invoke(self.callback, **ctx.params) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 610, in invoke >>> return callback(*args, **kwargs) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/decorators.py", >>> line 73, in new_func >>> return ctx.invoke(f, obj, *args, **kwargs) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 610, in invoke >>> return callback(*args, **kwargs) >>> File >>> "/usr/lib/python3/dist-packages/kamcli/commands/cmd_subscriber.py", >>> line 118, in subscriber_show >>> ioutils_dbres_print(ctx, oformat, ostyle, res) >>> File "/usr/lib/python3/dist-packages/kamcli/ioutils.py", >>> line 45, in ioutils_dbres_print >>> gstring = tabulate(allrows, headers=res.keys(), >>> tablefmt=ostyle) >>> File "/usr/local/lib/python3.7/dist-packages/tabulate.py", >>> line 1529, in tabulate >>> tabular_data, headers, showindex=showindex >>> File "/usr/local/lib/python3.7/dist-packages/tabulate.py", >>> line 1162, in _normalize_tabular_data >>> "headers for a list of dicts is not a dict or a keyword" >>> ValueError: headers for a list of dicts is not a dict or a >>> keyword >>> >>> >>> TEST WITH PGSQL >>> root@kamailio-BT:~# kamcli -c /etc/kamcli/kamcli.ini.pgsql >>> subscriber show >>> +------+------------+----------+------------+-------+--------+ >>> | id | username | domain | password | ha1 | ha1b | >>> +======+============+==========+============+=======+========+ >>> +------+------------+----------+------------+-------+--------+ >>> root@kamailio-BT:~# kamcli -c /etc/kamcli/kamcli.ini.pgsql >>> subscriber add test password >>> root@kamailio-BT:~# kamcli -c /etc/kamcli/kamcli.ini.pgsql >>> subscriber show >>> Traceback (most recent call last): >>> File "/usr/bin/kamcli", line 11, in <module> >>> load_entry_point('kamcli==2.0.0', 'console_scripts', >>> 'kamcli')() >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 829, in __call__ >>> return self.main(*args, **kwargs) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 782, in main >>> rv = self.invoke(ctx) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 1259, in invoke >>> return _process_result(sub_ctx.command.invoke(sub_ctx)) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 1259, in invoke >>> return _process_result(sub_ctx.command.invoke(sub_ctx)) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 1066, in invoke >>> return ctx.invoke(self.callback, **ctx.params) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 610, in invoke >>> return callback(*args, **kwargs) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/decorators.py", >>> line 73, in new_func >>> return ctx.invoke(f, obj, *args, **kwargs) >>> File >>> "/usr/local/lib/python3.7/dist-packages/click/core.py", line >>> 610, in invoke >>> return callback(*args, **kwargs) >>> File >>> "/usr/lib/python3/dist-packages/kamcli/commands/cmd_subscriber.py", >>> line 118, in subscriber_show >>> ioutils_dbres_print(ctx, oformat, ostyle, res) >>> File "/usr/lib/python3/dist-packages/kamcli/ioutils.py", >>> line 45, in ioutils_dbres_print >>> gstring = tabulate(allrows, headers=res.keys(), >>> tablefmt=ostyle) >>> File "/usr/local/lib/python3.7/dist-packages/tabulate.py", >>> line 1529, in tabulate >>> tabular_data, headers, showindex=showindex >>> File "/usr/local/lib/python3.7/dist-packages/tabulate.py", >>> line 1162, in _normalize_tabular_data >>> "headers for a list of dicts is not a dict or a keyword" >>> ValueError: headers for a list of dicts is not a dict or a >>> keyword >>> >>> root@kamailio-BT:~# kamctl show test >>> 1|test|sip.test.dev >>> >>> <http://sip.test.dev>|password|4380ea9069e888b5fc92996495a0f481|3a36aeb0df7f4504cc5d9b97dab540e5 >> >> thanks for reporting! >> >> I could reproduce the sqlite problems, they seemed to be >> related to the sql driver for sqlalchemy that was not >> supporting variadic number of parameters to the sql query >> execution function. I replaced with string formatting and now >> seems to work. Try with latest git version and report back if >> there are still issues. >> >> The one for postgres I couldn't reproduce, but it was after a >> commit related to output style default value. Although it >> didn't seem related, it worked what I tried for postgres. >> Again, test now with latest git version and if there is still >> a problem, provide updated traces. >> >> Cheers, >> Daniel >> >> -- >> Daniel-Constantin Mierla -- www.asipto.com <http://www.asipto.com> >> www.twitter.com/miconda <http://www.twitter.com/miconda> -- >> www.linkedin.com/in/miconda <http://www.linkedin.com/in/miconda> >> Kamailio Advanced Training - Online >> May 17-20, 2021 (Europe Timezone) - June 7-10, 2021 (America >> Timezone) >> * https://www.asipto.com/sw/kamailio-advanced-training-online/ >> <https://www.asipto.com/sw/kamailio-advanced-training-online/> >> >> >> _______________________________________________ >> Kamailio (SER) - Users Mailing List >> sr-users@lists.kamailio.org <mailto:sr-users@lists.kamailio.org> >> https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users >> <https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users> > > > -- > Daniel-Constantin Mierla -- www.asipto.com <http://www.asipto.com> > www.twitter.com/miconda <http://www.twitter.com/miconda> -- > www.linkedin.com/in/miconda <http://www.linkedin.com/in/miconda> > Kamailio Advanced Training - Online > May 17-20, 2021 (Europe Timezone) - June 7-10, 2021 (America Timezone) > * https://www.asipto.com/sw/kamailio-advanced-training-online/ > <https://www.asipto.com/sw/kamailio-advanced-training-online/> > -- Daniel-Constantin Mierla -- www.asipto.com www.twitter.com/miconda -- www.linkedin.com/in/miconda Kamailio Advanced Training - Online May 17-20, 2021 (Europe Timezone) - June 7-10, 2021 (America Timezone) * https://www.asipto.com/sw/kamailio-advanced-training-online/
_______________________________________________ Kamailio (SER) - Users Mailing List sr-users@lists.kamailio.org https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users