…
…
/newbot	-	create	a	new	bot
/token	-	generate	authorization	token
/revoke	-	revoke	bot	access	token
/setname	-	change	a	bot...
…
#	dt	pg_catalog.
																				List	of	relations
			Schema			|										Name											|	Type		|		Owner			
---------...
…
…
CREATE	EXTENSION	postgres_fdw;
CREATE	SERVER	servidor_de_consultas	FOREIGN	DATA	WRAPPER	postgres_fdw	
			OPTIONS	(host	'19...
CREATE	FOREIGN	TABLE	valores_constantes	(
				resultado1	character	varying,
				resultado2	character	varying
)	server	mult...
SELECT	*	FROM	valores_constantes;
		test			|		test2
---------+----------
	test	0		|	test2	0
	test	1		|	test2	1
	test	2		|	...
void	BeginForeignScan	(ForeignScanState	*node,	int	eflags);
TupleTableSlot	*IterateForeignScan	(ForeignScanState	*node);
v...
List	*	PlanForeignModify	(PlannerInfo	*root,	ModifyTable	*plan,	Index	resultRelation,	
int	subplan_index);
void	BeginForei...
def	execute(self,	quals);
def	insert(self,	new_values);
def	update(self,	old_values,	new_values);
def	delete(self,	old_val...
ConstantForeignDataWrappe
r
$	tree	myfdw
.
|--	myfdw/
|			`--	__init__.py
`--	setup.py
ConstantForeignDataWrappe
r
setup.py
setup(
		name='myfdw',
		version='0.0.1',
		author='Seu	Nome',
		license='Postgresql'...
ConstantForeignDataWrappe
r
__init__.py
from	multicorn	import	ForeignDataWrapper
class	ConstantForeignDataWrapper(ForeignD...
…
TelegramFdw
…
…
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Se meu elefante falasse
Próximos SlideShares
Carregando em…5
×

Se meu elefante falasse

388 visualizações

Publicada em

Palestra ministrada no PGDay Curitiba 2016 na CELEPAR.

Nesta palestra demonstro como fazer o PostgreSQL falar conosco criando um bot para o Telegram através de Foreign Data Wrappers.

Mais detalhes em:

- http://guedesoft.net
- http://github.com/guedes/telegram_fdw

Publicada em: Software
1 comentário
1 gostou
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
388
No SlideShare
0
A partir de incorporações
0
Número de incorporações
9
Ações
Compartilhamentos
0
Downloads
9
Comentários
1
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Se meu elefante falasse

  1. 1. …
  2. 2.
  3. 3. /newbot - create a new bot /token - generate authorization token /revoke - revoke bot access token /setname - change a bot's name /setdescription - change bot description /setabouttext - change bot about info /setuserpic - change bot profile photo /setcommands - change bot commands list /setjoingroups - can your bot be added to groups? /setprivacy - what messages does your bot see in groups? /deletebot - delete a bot /cancel - cancel the current operation
  4. 4.
  5. 5. # dt pg_catalog. List of relations Schema | Name | Type | Owner ------------+-------------------------+-------+---------- pg_catalog | pg_aggregate | table | postgres ... pg_catalog | pg_class | table | postgres ... pg_catalog | pg_database | table | postgres pg_catalog | pg_foreign_data_wrapper | table | postgres pg_catalog | pg_foreign_server | table | postgres pg_catalog | pg_foreign_table | table | postgres pg_catalog | pg_index | table | postgres ... pg_catalog | pg_language | table | postgres ... pg_catalog | pg_operator | table | postgres ... pg_catalog | pg_type | table | postgres pg_catalog | pg_user_mapping | table | postgres
  6. 6.
  7. 7.
  8. 8. CREATE EXTENSION postgres_fdw; CREATE SERVER servidor_de_consultas FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.168.1.1', dbname 'banco', port '5432'); CREATE USER MAPPING FOR CURRENT_USER SERVER servidor_de_consultas OPTIONS (user 'usuario_consulta', password 'consulta'); CREATE FOREIGN TABLE pessoas (cpf numeric, nome varchar) SERVER servidor_de_consultas OPTIONS ( schema_name 'recursos_humanos', table_name 'tb_funcionarios'); EXPLAIN (ANALYZE,VERBOSE, BUFFERS) SELECT * FROM pessoas WHERE cpf = 1234567891; ------------------------------------------------------- Foreign Scan on public.pessoas (cost=100.00..118.06 rows=3 width=104) (actual time=4 6.039..46.040 rows=1 loops=1) Output: cpf, nome Remote SQL: SELECT cpf, nome FROM recursos_humanos.tb_funcionarios WHERE ((cpf = 12 34567891::numeric)) Planning time: 0.061 ms Execution time: 105.232 ms
  9. 9. CREATE FOREIGN TABLE valores_constantes ( resultado1 character varying, resultado2 character varying ) server multicorn_srv options ( wrapper 'myfdw.ConstantForeignDataWrapper' ) SELECT * from valores_constantes;
  10. 10. SELECT * FROM valores_constantes; test | test2 ---------+---------- test 0 | test2 0 test 1 | test2 1 test 2 | test2 2 test 3 | test2 3 test 4 | test2 4 test 5 | test2 5 test 6 | test2 6 test 7 | test2 7 test 8 | test2 8 test 9 | test2 9 (10 rows)
  11. 11. void BeginForeignScan (ForeignScanState *node, int eflags); TupleTableSlot *IterateForeignScan (ForeignScanState *node); void ReScanForeignScan (ForeignScanState *node); void EndForeignScan (ForeignScanState *node);
  12. 12. List * PlanForeignModify (PlannerInfo *root, ModifyTable *plan, Index resultRelation, int subplan_index); void BeginForeignModify (ModifyTableState *mtstate, ResultRelInfo *rinfo, List *fdw_pr ivate, int subplan_index, int eflags); TupleTableSlot * ExecForeignInsert (EState *estate, ResultRelInfo *rinfo, TupleTableSl ot *slot, TupleTableSlot *planSlot); TupleTableSlot * ExecForeignUpdate (EState *estate, ResultRelInfo *rinfo, TupleTableSl ot *slot, TupleTableSlot *planSlot); TupleTableSlot * ExecForeignDelete (EState *estate, ResultRelInfo *rinfo, TupleTableSl ot *slot, TupleTableSlot *planSlot); void EndForeignModify (EState *estate, ResultRelInfo *rinfo); int IsForeignRelUpdatable (Relation rel);
  13. 13. def execute(self, quals); def insert(self, new_values); def update(self, old_values, new_values); def delete(self, old_values);
  14. 14. ConstantForeignDataWrappe r $ tree myfdw . |-- myfdw/ | `-- __init__.py `-- setup.py
  15. 15. ConstantForeignDataWrappe r setup.py setup( name='myfdw', version='0.0.1', author='Seu Nome', license='Postgresql', packages=['myfdw'] )
  16. 16. ConstantForeignDataWrappe r __init__.py from multicorn import ForeignDataWrapper class ConstantForeignDataWrapper(ForeignDataWrapper): def __init__(self, options, columns): super(ConstantForeignDataWrapper, self).__init__(options, columns) self.columns = columns def execute(self, quals, columns): for index in range(10): # arqui esta o total de registros line = {} for column_name in self.columns: line[column_name] = '%s %s' % (column_name, index) yield line
  17. 17.
  18. 18. TelegramFdw
  19. 19.
  20. 20.

×