Introdução a bancos de dados SQLite com Python e módulo sqlite3

Bóson Treinamentos
27 Mar 202427:11

Summary

TLDRThis video by Fábio from Boson Treinamentos introduces SQLite databases with Python. It explains SQLite as a lightweight, self-contained relational database management system, often embedded in devices like smartphones and tablets. SQLite is serverless, meaning it doesn't require a separate server process, and it's transactional with ACID properties. The tutorial covers how to use Python's sqlite3 module to create and manage databases, emphasizing the importance of understanding concepts like connectors, cursors, and transactions. It demonstrates creating a database, inserting data, and querying with Python, concluding with the use of a graphical tool, SQL Studio, for database management.

Takeaways

  • 📚 SQLite is a lightweight, serverless, and self-contained relational database management system, often embedded in applications.
  • 🔗 SQLite is written in C and is available on various platforms including smartphones, tablets, and computers.
  • 🌐 The official website for SQLite is sqlite.org, which provides comprehensive documentation and downloads.
  • 🐍 Python has SQLite built-in, which means there's no need for separate installation. It can be used via the sqlite3 module.
  • 🛠️ SQLite is case insensitive and supports dynamic types, allowing for storing any value in any column regardless of the declared type.
  • 🔄 SQLite supports transactions that are atomic, consistent, isolated, and durable (ACID), ensuring data integrity.
  • 📈 SQLite allows for creating in-memory databases for faster access and supports multiple simultaneous database connections.
  • 🚀 For developing applications with SQLite, the source code can be included as a file (sqlite3.c) and compiled into the project.
  • 🔗 SQLite does not require a separate server process, unlike other database systems such as SQL Server or PostgreSQL.
  • 🛡️ SQLite lacks direct network access and does not have built-in user authentication or complex permission systems.
  • 📝 The sqlite3 module in Python provides an interface that is compatible with the DB API 2.0, allowing for easy database interaction and portability of code between different database systems.

Q & A

  • What is SQLite and why is it used?

    -SQLite is a relational database management system, which is actually a software library written in the C language. It provides an environment for managing relational databases. It is lightweight in terms of setup, administration, and the resources required to run the system. It is embedded in almost all smartphones, tablets, and computers, and is used by applications that access certain types of databases.

  • Why is SQLite referred to as 'light'?

    -SQLite is referred to as 'light' because it is very lightweight in terms of configuration, administration, and the resources needed to operate the system.

  • How can I find more information about SQLite?

    -You can find more information about SQLite, including its extensive documentation and downloads, on its official website at sqlite.org.

  • Is it necessary to install SQLite separately when using Python?

    -No, it is not necessary to install SQLite separately when using Python because it is already embedded within the Python language. You can simply use it without any additional installation.

  • What are some key characteristics of SQLite?

    -SQLite is self-contained, meaning it requires minimal support from the operating system or other libraries. It is serverless, meaning it does not require a server to function, unlike other database systems like SQL Server or PostgreSQL. It also has zero-configuration due to its serverless architecture and supports transactions with ACID properties.

  • What does it mean for SQLite to be serverless?

    -Being serverless means that SQLite does not require a separate server process to operate. The database is integrated directly into the application that accesses the database, which simplifies deployment and management.

  • How does SQLite handle data types in its tables?

    -SQLite employs dynamic types for its tables, which means it is possible to store any value in any column, regardless of the data type. This is different from traditional databases that enforce strict data types for each column.

  • What is the purpose of the sqlite3 module in Python?

    -The sqlite3 module in Python provides an interface that is SQL-compatible with the DB-API 2.0 specification, as described by PEP 24. This encourages similarity between Python modules used for accessing databases, making them easier to understand and use for developers.

  • What is the role of a cursor in SQLite when using Python?

    -A cursor is an object used to navigate and manipulate the results of SQL execution in the database. It is obtained from a database connection and allows executing SQL commands and iterating over the results, as well as managing transactions in the database.

  • What is a transaction in the context of SQLite and database management?

    -A transaction is a sequence of operations that are treated as a single unit of work in the database. It includes various operations like inserting, updating, deleting, and querying records. Transactions ensure data consistency and integrity according to the ACID properties.

  • How can you ensure that changes made to the SQLite database are saved?

    -To ensure that changes made to the SQLite database are saved, you need to use the commit method provided by the connector. This confirms and permanently saves the changes made to the database. If there is a failure, you can use the rollback method to undo the changes.

  • What is the basic workflow for creating and managing a SQLite database using Python?

    -The basic workflow involves creating a connection to the database using the Connect method, creating a cursor from this connection, using the cursor to execute SQL commands, committing changes if necessary, and finally closing the cursor and the connection once the work is done.

  • How can you insert data into a SQLite table using Python?

    -To insert data into a SQLite table using Python, you can use the cursor's execute method with an INSERT INTO statement followed by the table name and values to be inserted. After executing the insert command, you must commit the changes to save them to the database.

  • What is a context manager and how does it simplify working with SQLite databases in Python?

    -A context manager is a language feature that allows for the management of resources using the 'with' statement. When working with SQLite databases in Python, a context manager ensures that the commit or rollback is done automatically, which simplifies the code and makes it more robust by handling these operations without manual intervention.

  • How can you verify if data has been inserted into a SQLite table correctly?

    -To verify if data has been inserted correctly, you can perform a SELECT query using the cursor's execute method to fetch the data from the table and then use fetchall() to retrieve all the records. You can also iterate over the cursor's results and print each row to check the inserted data.

  • What is the significance of using placeholders in SQL statements when inserting data?

    -Placeholders in SQL statements, such as the question marks (?), are used to bind the values from Python with the SQL statement. This practice is important for security reasons as it helps to prevent SQL injection attacks.

  • How can you use a graphical tool to manage and manipulate a SQLite database?

    -You can use graphical tools like SQL Studio to manage and manipulate a SQLite database. These tools allow you to connect to the database, view and edit tables, run SQL queries, and perform various database operations through a user-friendly interface.

  • What are some limitations of SQLite when compared to other database systems?

    -Some limitations of SQLite include the lack of direct network access since it does not provide server management, no support for user authentication, and no defined database permissions. However, it is important to note that these limitations can be addressed by implementing custom access control and security measures within the application itself.

  • Can you prototype applications using SQLite and then port the code to other database systems?

    -Yes, you can prototype applications using SQLite and then port the code to other types of databases such as PostgreSQL or MySQL. This is useful for initial development and testing phases before migrating to a more robust database system.

  • How does SQLite handle case sensitivity in its queries?

    -SQLite is case insensitive, meaning it does not differentiate between uppercase and lowercase letters in queries.

Outlines

00:00

🔧 Introduction to SQLite and Python Integration

This paragraph introduces the concept of SQLite as a lightweight, serverless, and self-contained relational database management system (RDBMS) embedded within the Python language. It highlights SQLite's ease of configuration, administration, and minimal resource requirements. SQLite is widely used across various devices, including smartphones and tablets, and is an open-source software available at sqlite.org. The speaker emphasizes that Python already includes SQLite, so no additional installation is needed. The paragraph also touches on SQLite's features, such as its dynamic data types, support for multiple simultaneous database access, and its serverless architecture, which simplifies deployment and management. However, it lacks direct network access and built-in user authentication, which developers must implement within their applications.

05:02

🛠 Setting Up SQLite with Python

The speaker explains the preliminary steps required to work with SQLite databases using Python. This includes understanding key concepts such as 'connectors' or 'adapters' that provide an interface for connecting to specific databases, and 'cursors' that are used to navigate and manipulate the results of SQL queries. The paragraph also discusses the importance of transactions in maintaining data consistency and integrity within the database. The speaker outlines a workflow for creating a database and recording data, which involves creating a connection with the database using the 'connect' method, followed by creating a cursor to execute SQL commands and manage transactions. The workflow concludes with closing the cursor and database connection after completing the database operations.

10:02

📚 Creating a Database and Table with SQLite in Python

The paragraph demonstrates the practical steps to create a SQLite database and a table using Python. It begins by importing the sqlite3 module and establishing a connection to the database, which will create a new database file if it doesn't exist or connect to the existing one. The speaker then shows how to create a cursor object and use it to execute SQL commands, such as creating a table named 'filme' with columns for title, year, and duration. The process involves writing a SQL statement within the 'execute' method of the cursor object and confirming the creation of the table by querying the SQLite master table. The speaker also explains how to insert data into the table using the 'insert into' SQL command and the importance of committing changes to the database to ensure they are saved.

15:04

📈 Inserting and Querying Data in SQLite Database

This section details the process of inserting multiple records into the SQLite database and querying the inserted data. The speaker first inserts individual film records using the 'insert into' statement and the 'execute' method of the cursor. Afterward, the speaker introduces a more efficient way to insert multiple records at once using a list of tuples, each representing a film's data. The 'executemany' method is used in conjunction with placeholders to bind the Python list data with the SQL statement. The speaker also emphasizes the importance of committing these changes with 'commit' to save them to the disk. To verify the insertion, the speaker executes a 'select' statement to retrieve and display the list of inserted films in the database.

20:06

🔄 Advanced SQLite Operations and Error Handling

The speaker discusses advanced operations in SQLite, such as using a for loop to iterate over a cursor's results and print each row, which allows for ordered data retrieval. They also introduce the concept of using a context manager with the 'with' statement for handling database connections, which automates commit and rollback processes, enhancing code robustness and simplifying error handling. The paragraph includes a practical example of using a context manager to insert a new film record and handle potential exceptions with a try-except block. The speaker also mentions the importance of closing the database connection after operations are completed to avoid issues like the inability to delete the database file while it's in use.

25:06

🖥️ Utilizing Graphical Tools for SQLite Database Management

In the final paragraph, the speaker introduces graphical tools like SQL Studio for managing and manipulating SQLite databases. They provide a brief tutorial on using SQL Studio, which includes downloading the tool from GitHub, setting it up, and connecting it to an existing SQLite database file. The speaker demonstrates how to use the tool to view and edit database structures and data, run SQL queries through an integrated editor, and manage database connections. The paragraph concludes with a mention of other similar tools available for SQLite database management and the benefits of using such tools for tasks like data visualization and error correction.

📘 Conclusion and Further Learning with SQLite and Python

The speaker wraps up the video by summarizing the key points covered, including creating a SQLite database, setting up tables, inserting records, and conducting queries. They express hope that the video was helpful and encourage viewers to subscribe to the channel, activate notifications for new content, and consider becoming a member of the channel's club for additional resources. The speaker also invites viewers to visit their website and follow them on social media for more information and future tutorials on SQLite and Python.

Mindmap

Keywords

💡SQLite

SQLite is a lightweight, serverless, self-contained relational database management system (RDBMS) written in C language. It is known for its simplicity and ease of configuration, requiring minimal setup and administration. In the video, the speaker discusses SQLite as a core topic, highlighting its presence in smartphones, tablets, and other devices that use applications requiring database access. The speaker also mentions that SQLite is embedded within the Python language, which means no additional installation is required to use it for database management tasks.

💡Database Management System (DBMS)

A Database Management System (DBMS) is a software system that allows the creation, maintenance, and manipulation of databases. In the context of the video, SQLite is described as a DBMS that provides an environment for managing relational databases. The script emphasizes that SQLite is different from other DBMS like SQL Server or PostgreSQL because it does not require a separate server process to operate.

💡Python

Python is a high-level, interpreted programming language known for its readability and versatility. In the video, Python is highlighted as the programming language used to interact with SQLite databases. The speaker mentions the use of Python scripts to create and manipulate databases using SQL commands, and introduces the 'sqlite3' module in Python, which provides an interface to SQLite databases.

💡Relational Database

A relational database is a type of database that stores data in a structured format, using rows and columns in tables. The video script explains that SQLite is a relational database system, meaning it organizes data into tables that can be related to one another through keys. This is a fundamental concept in database management and is central to the discussion of how SQLite operates.

💡Cursor

In the context of databases and the Python programming language, a cursor is an object used to navigate and manipulate the results of executing SQL commands. The video script describes the cursor as an essential object obtained from a database connection, which allows for the execution of SQL commands and iteration over the results.

💡Transaction

A transaction in database management is a sequence of operations treated as a single unit of work. The video script explains that transactions are used to ensure data consistency and integrity according to the ACID properties (Atomicity, Consistency, Isolation, Durability). The speaker also mentions methods like 'commit' and 'rollback' that are used to manage transactions in SQLite.

💡Dynamic Types

Dynamic types refer to the flexibility of a database system to store any value in any column, regardless of the data type. The video script points out that SQLite employs dynamic types for its tables, which is different from traditional databases that require strict data typing. This feature allows for more flexibility when storing data.

💡SQLite3 Module

The 'sqlite3' module in Python is a built-in interface that provides a SQL-compatible API to interact with SQLite databases. The video script introduces this module as the specific tool used to work with SQLite databases in Python, highlighting its importance for creating and managing databases within Python scripts.

💡Connection

In the context of databases, a connection refers to the link established between a database client and the database server. The video script discusses the process of creating a connection to an SQLite database using the 'sqlite3.connect' method in Python, which is the first step in database interaction before any operations can be performed.

💡In-Memory Database

An in-memory database is a database that resides in the main memory (RAM) instead of on disk. The video script mentions that SQLite allows for the creation of in-memory databases for faster access, which is an alternative to the traditional disk-based databases and can be beneficial for certain applications that require quick read/write operations.

💡Graphical User Interface (GUI) Tools

Graphical User Interface (GUI) tools are software applications that allow users to interact with the computer through graphical icons and visual indicators instead of text-based commands. In the video script, the speaker refers to GUI tools like SQL Studio, which can be used to manage and manipulate SQLite databases visually, providing an alternative to working with Python scripts for database management.

Highlights

SQLite is a lightweight, serverless, self-contained database engine that requires minimal setup and administration.

SQLite is widely used in smartphones, tablets, and computers, and is embedded within the Python language.

SQLite is open-source software available at sqlite.org, with extensive documentation and downloads.

SQLite databases are file-based, and the engine does not require a separate server process to operate.

SQLite supports ACID transactions, ensuring that database operations are atomic, consistent, isolated, and durable.

SQLite allows for dynamic data types, where any value can be stored in any column regardless of the declared type.

SQLite supports single database connections to access multiple database files simultaneously.

SQLite databases can be created in-memory for faster access, as an alternative to on-disk storage.

SQLite does not support network access or user authentication directly, requiring application-level security.

SQLite is case insensitive and does not differentiate between uppercase and lowercase letters.

The sqlite3 module in Python provides an interface to interact with SQLite databases using SQL commands.

The DB-API 2.0 specification encourages consistency among Python database modules, making them more understandable and portable.

A database connection in Python is established using the sqlite3.connect() method, which creates or connects to a database file.

Cursor objects in Python are used to execute SQL commands and iterate over the results within a database.

The commit method is essential for confirming changes to the database, while rollback undoes any failed changes.

Python's sqlite3 module allows for creating, managing, and querying SQLite databases with Python scripts.

The sqlite3 module supports inserting multiple records into a table using the executemany() method.

Using placeholders (?) in SQL commands helps prevent SQL injection attacks and is a security best practice.

The context manager with the 'with' statement in Python automates commit or rollback processes for database transactions.

Graphical tools like SQLite Studio can be used alongside Python scripts to manage and visualize SQLite databases.

SQLite is particularly useful for lightweight applications, such as those running on smartphones or tablets.

Transcripts

play00:00

fala pessoal aqui é o Fábio da boson

play00:02

Treinamentos e nesse vídeo vamos falar

play00:03

sobre bancos de dados sqlite com python

play00:07

primeiramente Uma Breve introdução ao

play00:09

que é o sqlite o sqlite que é um sistema

play00:12

de gerenciamento de bancos de dados

play00:14

relacionais Na verdade uma biblioteca de

play00:16

software feita em linguagem C que

play00:19

fornece um ambiente para gerenciamento

play00:23

de bancos de dados do tipo relacional e

play00:25

o light da palavra S Light significa que

play00:28

ele é muito leve em termos de

play00:30

configuração administração e também dos

play00:32

recursos que são necessários para para

play00:34

rodar esse tipo de sistema o sqlite você

play00:37

vai encontrar em todos os smartphones

play00:40

tablets na maioria dos computadores e

play00:41

outros equipamentos que utilizem

play00:44

aplicações que acessam determinados

play00:45

tipos de bancos de dados sendo software

play00:48

livre e de código aberto o site oficial

play00:51

do sqlite é o sqlite.org este que vocês

play00:55

vem aqui na tela aqui você vai encontrar

play00:58

toda a informação necessária a respeito

play01:00

desse sistema incluindo Sua vasta

play01:02

documentação downloads etc a gente não

play01:05

vai precisar baixar porque o SQL ele já

play01:07

é embutido dentro da linguagem Python

play01:10

Então não é necessário instalar ele já

play01:12

está lá É só usar o sqlite tem umas

play01:15

características interessantes ele é um

play01:17

sistema

play01:18

autocontido significa que ele ele ele

play01:20

requer o suporte mínimo do sistema

play01:22

operacional ou de uma outra

play01:24

biblioteca e assim você pode utilizar em

play01:26

qualquer ambiente principalmente em

play01:28

dispositivos m móveis incorporados tipo

play01:31

smartphone iPhones consoles de jogos etc

play01:35

o código fonte dele tá disponível na

play01:37

forma de um arquivo sqlite

play01:40

3.cc desenvolver uma aplicação que

play01:42

utilize o sqlite É só colocar os

play01:44

arquivos específicos dele no projeto e

play01:46

fazer a compilação ele é sem Servidor

play01:49

serverless ou seja ele não requer um

play01:51

servidor para funcionar Diferentemente

play01:54

de outros sistemas de bancos de dados

play01:55

como SQL server o post igres uma SQL que

play01:58

precisam de um processo rando em um

play02:00

servidor para operar um processo

play02:02

separado Ou seja você precisa instalar

play02:04

um server para isso skif não precisa

play02:07

disso o banco de dados é integrado

play02:09

diretamente à aplicação que acessa o

play02:11

banco de dados sua configuração é zero

play02:14

justamente por conta do sua arquitetura

play02:16

serverless a gente não precisa instalar

play02:17

sqlite a de usar não tem nenhum processo

play02:20

de servidor para configurar iniciar ou

play02:22

interromper ele também não usa arquivos

play02:24

de configuração e ele é transacional

play02:27

todas as transações do SQL são comp com

play02:30

com acid Isso significa que as consultas

play02:33

alterações são atômicas consistentes

play02:35

isoladas e duráveis toal do aed ele

play02:39

também possui suporte a subconsultas

play02:41

transações junções pesquisa de texto

play02:43

restrição de chave estrangeira e muitas

play02:45

outras funcionalidades mas não é 100%

play02:48

compatível com tudo o que o SQL nos

play02:51

fornece para nós aqui isso aqui é

play02:53

suficiente nosso objetivo é criar

play02:55

scripts em Python que consigam Criar e

play02:57

manipular bancos de dados utilizando SQL

play03:00

mas skite também tem alguns outros

play03:01

recursos interessantes ele emprega tipos

play03:04

dinâmicos para as tabelas Ou seja é

play03:06

possível armazenar qualquer valor em

play03:08

qualquer coluna independente do tipo de

play03:10

dados bem diferente de bancos de dados

play03:12

tradicionais permite uma única conexão

play03:15

de banco de dados eh acessando vários

play03:17

arquivos do banco simultaneamente a

play03:20

gente consegue assim ter tabelas de

play03:21

bancos separados e uni-las dentro da

play03:24

nossa aplicação e até mesmo copiar dados

play03:26

de um banco para outro e ele também

play03:28

permite criar bancos de dados de acesso

play03:30

na memória em vez de disco cujo acesso

play03:33

obviamente vai ser muito mais rápido

play03:36

agora por não ter um servidor para

play03:38

gerenciamento o sqlite não provê acesso

play03:40

direto pela rede Além disso ele não tem

play03:42

suporte de autenticação com usuários

play03:44

permissões definidas ório de banco de

play03:47

dados no caso permissão para criar

play03:49

tabela inserir excluir registros etc mas

play03:52

lógico que a gente tem que implementar

play03:54

autenticação e segurança nosso próprio

play03:57

controle de acesso na aplicação em si é

play04:00

possível a gente prototipar aplicativos

play04:02

usando sqlite e depois portar o código

play04:04

para outro tipo de banco de dados como

play04:06

post gress ou mais SQL e outra coisa

play04:09

importante o sqlite é case insensitive

play04:12

não diferencia maiúsculas de minúsculas

play04:14

introdução super rápid só pra gente ter

play04:16

uma noção do que é o sqlite e pra gente

play04:18

poder trabalhar com sqlite no Python a

play04:20

gente vai usar um módulo específico

play04:22

Chamado sqlite 3 Esse é um módulo que

play04:25

fornece uma interface SQL compatível com

play04:28

a especificação Deb api 2.0 que é

play04:31

descrito pela PEP 24 249 e PEP significa

play04:36

Python enhancement proposal proposta de

play04:38

melhoria do Python e essa api ela foi

play04:41

definida para para incentivar a

play04:42

similaridade entre os módulos Python que

play04:44

são usados para acessar bancos de dados

play04:46

se a gente tem consistência e e

play04:49

conseguimos tornar os módulos fáceis de

play04:51

entender gera código que é portável

play04:54

entre os bancos de dados entre entre si

play04:56

né entre os sistemas distintos e traz um

play04:58

alcance mais amplo de conectividade Aí

play05:01

estão os sites oficiais tanto da

play05:03

biblioteca quanto da pep 249 o site da

play05:07

biblioteca é esse aqui sqlite 3 a gente

play05:10

vai também ter toda a informação

play05:12

necessária Aqui tem bastante coisa para

play05:14

você estudar certo a gente vai ver só um

play05:16

mínimo disso aqui no vídeo de hoje só

play05:19

entender como é que a gente cria e

play05:20

Gerencia um banquinho de dados bem

play05:22

simples de uma tabelinha só e eu vou

play05:24

deixar os links todos aqui embaixo na

play05:26

descrição do vídeo também antes da gente

play05:28

poder criar o banco de dados usando o

play05:30

Python ou seja antes da gente codificar

play05:32

vamos entender alguns conceitos básicos

play05:34

bem simples e rápidos primeiro conceito

play05:36

é o de conector também chamado de

play05:38

adaptador conector ou adaptador é a

play05:41

biblioteca ou módulo no Python que vai

play05:43

fornecer essa Interface para conexão ao

play05:45

banco de dados específico e geralmente

play05:48

com vários métodos e propriedades

play05:50

atributos para estabelecer conexão com o

play05:52

banco Enviar as consultas e recuperar os

play05:54

resultados aqui tem alguns exemplos o

play05:57

psych pg2 para post SQL o p MySQL para

play06:01

MySQL Inclusive a gente tem vídeos aqui

play06:03

no canal sobre o p MySQL dá uma

play06:05

pesquisadinha e pro sqlite temos o

play06:07

sqlite 3 essa biblioteca que eu acabei

play06:10

de mostrar que é que a gente vai

play06:11

utilizar como conector outro conceito

play06:14

importante é o de cursor o cursor é um

play06:16

objeto que vai ser usado para navegar e

play06:19

manipular os resultados da execução do

play06:21

SQL no banco de dados de uma consulta

play06:23

por exemplo e o cursor ele é obtido a

play06:25

partir de uma conexão com o banco de

play06:27

dados então a gente estabelece a conexão

play06:29

e cria o cursor que vai nos permitir

play06:31

executar os comandos SQL e fazer a

play06:34

iteração sobre os resultados e também

play06:36

gerenciar as transações no banco de

play06:37

dados Então esse é um objeto importante

play06:39

E além disso a gente precisa entender o

play06:41

que que é uma transação transação é uma

play06:44

sequência de operações que vai ser

play06:46

tratado como se fosse uma única operação

play06:48

ou uma única unidade de trabalho no

play06:50

banco de dados inserção de registros

play06:53

atualizações exclusão consultas variadas

play06:56

e assim por diante as transações elas

play06:58

existem para garantir consistência e

play07:00

integridade dos dados de acordo com o

play07:02

conceito do essent que eu citei agora H

play07:04

pouco e elas são gerenciadas com métodos

play07:06

que são fornecidos pelos conectores por

play07:09

exemplo o método commit que confirma que

play07:11

grava inde definitivas alterações no

play07:14

banco de dados ou rollback que desfaz

play07:16

alterações realizadas que tenham tido

play07:19

algum tipo de falha então isso tudo faz

play07:21

parte do conceito de transação dea

play07:23

dessas ideias do conector do cursor da

play07:26

transação e sabendo que a gente vai

play07:27

utilizar o módulo que o light 3 a gente

play07:31

vai seguir um fluxo de trabalho para

play07:34

poder criar um banco de dados e gravar

play07:36

uns dados nesse banco o fluxo de

play07:37

trabalho vai ser o seguinte primeiro a

play07:39

gente cria uma conexão com o banco de

play07:41

dados para isso existe um método Connect

play07:43

depois a gente cria um cursor com essa

play07:44

conexão Depois a gente vai utilizar o

play07:46

cursor para enviar os comandos ao banco

play07:48

de dados executar tarefas com os objetos

play07:51

como as consultas por exemplo se for

play07:53

feito algum tipo de modificação no banco

play07:55

de dados como um update um delete ou

play07:57

insert a gente precisa efetivar a

play08:00

alteração com o método commit e PR

play08:03

consultas não precisa ou então a gente

play08:05

desfaz com RB se houver falha e no final

play08:08

de tudo finalizamos o nosso trabalho com

play08:10

o banco de dados a gente fecha o cursor

play08:12

e a conexão legal esse vai ser o nosso

play08:14

fluxo de trabalho como é que a gente vai

play08:16

fazer isso a gente vai fazer isso

play08:18

utilizando Python e a nossa biblioteca

play08:20

então agora é a hora da prática vamos lá

play08:23

pro Python e vamos criar uma tabelinha

play08:25

um banquinho de dados simples e ver como

play08:27

é que é isso aqui na

play08:28

prática tô aqui no meu Júpiter notebook

play08:31

eu já tenho um scriptz inho que eu vou

play08:32

mostrar é para vocês como funciona e o

play08:35

código dele é o que eu vou explicar

play08:37

deixa eu abrir aqui o meu script bom

play08:39

como é que a gente trabalha com isso

play08:41

aqui primeiro a gente tem que criar o

play08:43

banco de dados e a conexão para isso a

play08:45

gente vai importar a o módulo sqlite 13

play08:48

e veja não é necessário instalar ele já

play08:51

está dentro do Python tá então é só dar

play08:54

um Import sqlite 3 se você preferir dar

play08:56

um Alias para elele também fique à

play08:57

vontade S qualquer coisa e aí a gente

play09:00

cria a conexão e ou o banco de dados

play09:04

para isso a gente vai chamar o método

play09:06

Connect como citado e dentro dos

play09:09

parênteses entre aspas a gente vai dar o

play09:11

nome do banco de dados com a extensão

play09:13

PDB eu vou criar um banco de dados

play09:15

chamado cinema para gravar dados sobre

play09:17

filmes e isso vai estar associado ao

play09:20

objeto com que vai ser a minha conexão a

play09:23

gente cria conexão assim eu vou executar

play09:26

isso aqui mas antes Olha só eu vou

play09:27

mostrar o que que eu tenho na minha

play09:28

pasta

play09:29

essa aqui é a pasta Onde tá o script Ó

play09:31

tem só o script uma pastinha do sqlite

play09:34

Studio então eu vou executar esse

play09:36

primeiro comando aqui executei parece

play09:38

que não aconteceu nada certo é ótimo

play09:40

quando não aparece nada porque significa

play09:42

que não houve erro também mas se eu

play09:44

olhar aqui na pastinha olha lá apareceu

play09:47

cinema PDB tá criado nosso banco de

play09:50

dados tamanho dele F size zero claro não

play09:53

tem nada no banco ainda é só um arquivo

play09:55

Zerado mas ele já tá criado Então veja

play09:58

se o banco de dados não existe Esse

play09:59

comando cria um novo banco de dados se

play10:02

ele já existe ele estabelece uma conexão

play10:04

com o banco já existente então o método

play10:06

Connect ele é inteligente suficiente

play10:08

para não sobrescrever um banco que já

play10:10

existe ele usa o que já existe ou cria

play10:12

um novo esse banco tá conectado ele tá

play10:15

online agora através desse objeto com

play10:19

próximo passo é criar o cursor que é

play10:20

aquele objeto que consegue iterar pelos

play10:22

itens dentro do banco de dados para isso

play10:25

a gente chama do com do objeto com o mé

play10:29

M cursor com os parênteses vazios a

play10:32

gente só tem que executar isso pronto tá

play10:35

criado se ele não não emitir nem uma

play10:37

mensagem de erro é porque funcionou

play10:39

temos um objeto na memória um cursor

play10:42

associado ao banco de dados cinema e

play10:45

agora a gente vai criar uma tabela para

play10:48

criar a tabela a gente vai usar do

play10:49

cursor lembra que é o cursor que executa

play10:51

os

play10:52

sqls Então a partir do cursor que eu

play10:54

chamei de cur eu vou chamar o método

play10:57

Execute esse método ele executa um SQL n

play11:01

uma declaração SQL no banco de dados que

play11:04

a gente tá trabalhando eu vou usar um

play11:06

basicão Create table tabela filme com

play11:09

três colunas título ano e duração entre

play11:12

aspas bonitinho veja que eu não tô

play11:14

especificando quem é chave primária quem

play11:16

é chave estrangeira os tipos de dados

play11:18

não é necessário fazer isso com sqlite a

play11:21

princípio ele vai criar um banco

play11:23

genérico genérico lembra-se que as

play11:25

colunas aceitam quaisquer tipos de dados

play11:27

na prática a gente vai tomar um pouco

play11:29

mais de cuidado do que isso a gente vai

play11:31

criar o banco de dados especificando

play11:32

direitinho os tipos mas isso a gente vai

play11:34

ver mais paraa frente num projetinho que

play11:35

a gente vai fazer aqui nessas aulas tá

play11:38

com mais detalhes Por enquanto só

play11:40

entender a dinâmica então quando eu

play11:41

executo Esse comando ele cria uma tabela

play11:45

ele vai me dar essa mensagem sqlite pcor

play11:48

@ e um endereço de memória tá criado

play11:51

isso aqui significa que deu certo a

play11:53

tabela está criada pra gente ter certeza

play11:55

mesmo a gente pode fazer eh um select na

play11:59

na tabela Master do sqlite que é o

play12:01

sqlite und Master essa aqui é uma tabela

play12:05

que vai mostrar todos os objetos que a

play12:06

gente tem no banco de dados então eu

play12:08

quero ver os nomes que eu tenho dentro

play12:10

dessa tabela Master ele vai me mostrar

play12:12

se a tabela foi criada ou não para isso

play12:14

a gente executa porque também é um SQL

play12:17

coloco isso num objeto eu chamei de re

play12:19

de resultado E aí nesse res a gente vai

play12:22

executar o método fetch One o método

play12:25

fetch One significa vá buscar um é um M

play12:29

que retorna uma linha do resultado que

play12:32

foi obtido Legal então se eu tenho

play12:34

várias linhas obtidas o fat One busca a

play12:36

primeira linha desse resultado então

play12:38

quando eu executar isso aqui ele vai

play12:40

mostrar para mim que eu tenho a tabela

play12:41

filme lá dentro olha só só ela tabelinha

play12:45

filme Note que os resultados eles vêm na

play12:47

forma de duplas sempre entre parênteses

play12:49

é o padrão dá para mudar isso dá existe

play12:52

um recurso no SQL chamado Row Factory

play12:56

Fábrica de linhas que permite que a

play12:58

gente mude o formato do retorno das

play13:01

consultas isso a gente vai ver também

play13:02

mais pra frente no curso mas por

play13:04

enquanto ele vai retornar sempre em

play13:05

tuplas então a tabela tá criada o banco

play13:08

de dados tá criado a tabela também

play13:10

dentro desse banco vamos inserir linhas

play13:12

na tabela para inserir linhas na tabela

play13:14

é fácil é um insert into Então a gente

play13:16

vai executar é sempre cursor P Execute E

play13:21

aí dentro dos parênteses a gente coloca

play13:24

o comando que a gente quer executar eu

play13:25

vou dar um insert into film values e

play13:28

aqui os filmes que eu vou inserir veja

play13:31

que eu não especifiquei aqui os nomes

play13:33

das colunas não é necessário desde que

play13:35

na hora de passar os valores você os

play13:37

passe por completo e na ordem exata em

play13:40

que as colunas foram criadas Então tem

play13:42

que lembrar a ordem em que você criou as

play13:43

colunas eu criei primeiro título do

play13:46

filme depois o ano e depois a duração em

play13:49

minutos então eu vou colocar dois filmes

play13:52

O Senhor dos Anéis e Conan O Bárbaro tá

play13:54

separados por vírgulas aqui eu usei um

play13:58

esqueminha de Doc string tá vendo para

play13:59

poder eh digitar Esse comando em

play14:02

múltiplas linhas bonitinho sem me

play14:04

preocupar com indentação nem nada mas

play14:06

você pode escrever ele numa linha só se

play14:07

você quiser não tem problema o

play14:09

importante é o seguinte ele vai executar

play14:11

Esse comando mas esse é um comando que

play14:12

altera a estrutura do banco de dados

play14:15

tudo que altera a estrutura do banco de

play14:17

dados precisa ser comit precisa ser

play14:20

confirmado Então logo após executar isso

play14:23

a

play14:24

conexão tem que chamar o método comit

play14:28

para etiv a mudança no disco no no HD no

play14:31

arquivo em si senão nada feito fica só

play14:33

na memória e você vai perder depois que

play14:35

fechar a conexão então Execute vai

play14:38

executar Esse comando Depois confirma

play14:40

então a gente executa esse bloco Tá

play14:43

feito não reclamou os filmes devem estar

play14:46

lá dentro pra gente ter certeza fazer

play14:49

consulta como é que a gente consulta

play14:52

cursor P Execute e o que a gente quer

play14:54

por exemplo eu quero saber os títulos da

play14:56

tabela filme então select título from

play14:58

fil fil mas que el comum aqui podem ser

play15:01

retornadas várias linhas uma ou mais

play15:04

linhas Então em vez de chamar o fat One

play15:06

para pegar um registro eu vou chamar o

play15:08

fatch All que significa busque todos

play15:11

todos os registros então o objeto R vai

play15:14

buscar todos os registros aqui dentro

play15:17

estão todos os registros só que num

play15:19

formato de objeto específico que você

play15:21

não consegue ler diretamente para você

play15:23

conseguir ler você usa o método fatch

play15:25

All Então quando você executa isso ele

play15:28

traz aqui Olha só uma lista veja que tá

play15:31

dentro de colchetes de tuplas sendo que

play15:34

cada tupla é um dos filmes que eu acabei

play15:36

de inserir temos dois filmes lá dentro

play15:38

portanto funcionou perfeitamente temos o

play15:40

banco de dados criado tabela e dados

play15:43

inseridos vamos inserir mais alguns

play15:45

registros para aumentar a nossa lista de

play15:47

filmes eu vou inserir de uma outra forma

play15:49

agora olha só eu vou criar uma lista

play15:51

literalmente que eu vou chamar de dados

play15:53

filmes essa é uma lista de tuplas sendo

play15:57

que cada tupla vai ter os dados de um

play15:58

dos filmes separados por vírgulas as

play16:01

Strings entre aspas e os números não

play16:04

então Indiana Jones A Última Cruzada

play16:06

1989 127 minutos e assim por diante

play16:09

então iso é uma lista E aí eu vou usar

play16:11

essa lista para inserir todos esses

play16:13

dados de uma vez na minha tabela como

play16:15

agora eu vou executar várias linhas de

play16:18

uma só vez eu posso utilizar um outro

play16:20

método chamado Execute many para que ele

play16:23

pegue cada uma das tuplas que estão

play16:25

dentro da lista e Execute essas tuplas

play16:28

separadamente E para isso eu vou passar

play16:30

o comando insert in filme aqui eu já tô

play16:32

especificando Quais são as colunas né

play16:34

opcionalmente mas eu vou especificar

play16:36

porque em valores em vez de escrever os

play16:38

valores eu vou colocar três

play16:40

interrogações que que é isso aqui isso

play16:43

aqui é um

play16:44

placeholder isso aqui serve para

play16:46

vincular os valores que estão na lista

play16:48

do Python com a declaração SQL E para

play16:51

isso aqui e isso aqui a gente usa para

play16:54

evitar ataques de injeção de SQL é muito

play16:57

importante você estabelecer no seu

play16:59

script para segurança então o método

play17:01

Execute Men ele sabe como lidar com isso

play17:03

ele vai pegar esse SQL e vai vincular

play17:06

com o conteúdo desta lista conteúdo

play17:09

dessa lista são tuplas com três itens

play17:12

dentro de cada tupla três valores cada

play17:14

um dos valores vai ser colocado em sua

play17:17

vez em uma das posições dadas por essas

play17:20

interrogações então por exemplo o

play17:21

primeiro filme indana Jones A Última

play17:23

Cruzada vai ser injetado aqui o 989 vai

play17:26

ser injetado aqui e o 127 aqui e aí esse

play17:30

registro vai ser inserido na tabela de

play17:32

filmes nas colunas correspondentes o

play17:35

próprio método execu faz a iteração vai

play17:37

pro próximo filme e faz todo o processo

play17:40

de novo injetando filme eh ano e duração

play17:44

até finalizar a lista que foi passada

play17:46

aqui como dados filmes e aí lembre-se

play17:49

isso também faz uma alteração no banco

play17:51

então no final Precisamos do commit com.

play17:54

commit então executando isso ele inseriu

play17:58

aqui aqui embaixo eu mandei executar o

play18:00

select título from filme e o fetch All

play18:02

de novo pra gente poder fazer a

play18:04

verificação E agora aparece pra gente a

play18:06

lista completa Olha só dos filmes agora

play18:09

eu tenho seis filmes inseridos os dois

play18:12

primeiros e mais quatro mandei vso ao

play18:14

título você pode evidentemente mandar

play18:16

vem o título O ano a duração ou só a

play18:18

duração o que você quiser é só fazer a

play18:20

consulta normal pode ordenar por data

play18:23

por por nome o SQL normal vai funcionar

play18:26

aqui então os filmes foram inseridos com

play18:28

suo existe uma outra forma da gente

play18:30

também Verificar se os dados foram

play18:32

inseridos corretamente que é usando um

play18:34

laço for Olha só para a linha dentro do

play18:38

cursor Execute Aí você faz a sua

play18:41

consulta aqui por exemplo eu vou chamar

play18:42

an título do filme e vou ordenar por ano

play18:46

e aí eu mando imprimir o conteúdo de

play18:48

cada linha tá quando eu executo isso ele

play18:50

traz dessa forma o ano e o título em

play18:54

ordem crescente de ano desde o mais

play18:56

antigo de 964 até o mais recente que é o

play18:59

Senhor dos Anéis aqui então para cada

play19:02

linha dentro do retorno do cursor P

play19:04

Execute faz a sua consulta e aí dar um

play19:07

print na linha ou você pode fazer outras

play19:08

coisas com a linha também né mandar para

play19:10

um arquivo de texto por exemplo e assim

play19:12

por diante fica seu critério que vai ser

play19:14

feito finalmente o último recurso que eu

play19:16

quero mostrar nesse vídeo é que a gente

play19:17

também pode trabalhar com gerenciador de

play19:19

contexto trabalhando com objeto

play19:22

Connection e aqui vai dispensar a gente

play19:25

fazer o commit ou rollback então caso

play19:28

você esqueça de fazer o o com. comit os

play19:32

dados não serão gravados ou alterados no

play19:34

disco apesar de parecer que foram e se

play19:37

houver erros Não haverá o rollback Isso

play19:39

é um problema então a gente pode usar um

play19:40

gerenciador de contexto que é a

play19:42

palavrinha wif e com ela o commit ou

play19:45

rack são automáticos você não precisa se

play19:47

preocupar em colocar esse comando ali né

play19:49

Isso já facilita sua vida e torna o seu

play19:51

código também um pouco mais robusto E

play19:53

além disso eu vou colocar esse

play19:54

gerenciador de contexto dentro de um

play19:56

bloco try

play19:57

accept para manipular exceção caso

play20:00

ocorra algum erro de conexão ao banco de

play20:02

dados por exemplo olha só tá ficando um

play20:03

pouquinho mais complexo mas aoo longo do

play20:05

curso a gente vai entendendo como usar

play20:07

esses conceitos com o banco de dados mas

play20:09

eles são importantes Então nesse exemplo

play20:11

aqui eu vou vou fazer um try tentar com

play20:15

o gerenciador de contexto da nossa

play20:18

conexão atual eu vou executar este

play20:20

insert e neste insert eu vou colocar

play20:23

mais um filme que é o openheimer no caso

play20:25

veja que eu continuo usando os

play20:27

placeholders aqui e passo uma uma tupla

play20:30

com os dados do filme posteriormente e

play20:32

poderia ser uma lista também E aí é o

play20:34

seguinte se houver exceção do tipo

play20:37

programming error eu vou dizer que o

play20:39

banco de dados não tá acessível Existem

play20:40

várias exceções que podem ser levantadas

play20:43

vários erros que podem ocorrer ao

play20:44

trabalhar com o sqlite depois eu vou vou

play20:47

mostrar em uma outra aula quais são elas

play20:49

e como é que a gente trabalha com cada

play20:50

uma delas mas é importante que a gente

play20:52

capture exceção senão o usuário fica

play20:54

vendido não sabe o que tá acontecendo se

play20:56

houver um erro e você também não

play20:57

consegue tratá e depois de inserir aí eu

play21:00

vou executar normalmente o nosso cursor

play21:02

vou mandar selecionar o título e vou dar

play21:04

um fetch All para verificar a lista

play21:06

completa de filmes para verificar se deu

play21:07

certo a inserção do openheimer que não

play21:10

existia até aqui por enquanto então eu

play21:12

vou executar esse bloco todo beleza

play21:15

executou já fez o commit comit eu não

play21:18

precisei colocar o com. commit aqui

play21:20

porque o if que é o comando gerenciador

play21:22

de contexto faz o comit automático Então

play21:25

já tá comit de modo que quando eu olho

play21:28

aqui a minha a lista Olha só openheimer

play21:29

foi inserido com sucesso e no fim depois

play21:33

da gente trabalhar e fazer o que tinha

play21:34

que ser feito no banco de dados a gente

play21:36

tem que fechar conexão senão o banco ele

play21:37

fica ativo certo ele fica ativo ele tá

play21:40

aberto se eu vier aqui em home Olha só

play21:43

selecionar esse arquivo aqui do cinema

play21:46

que é o meu banco de dados e tentar

play21:48

excluir esse arquivo vou dar um delete

play21:50

tem certeza que quer apagar

play21:52

permanentemente

play21:53

delete ó delete failed não dá para para

play21:57

excluir porque ele tá em uso ele tá

play21:59

conectado esse banco certo ó tá com 8 KB

play22:03

de tamanho agora que são os dados que eu

play22:04

acabei de colocar então o banco tá

play22:06

conectado Eu preciso fechar a conexão

play22:08

quando eu não vou usar mais para isso

play22:11

com Connection pon Close só executar

play22:14

Esse comando e a conexão tá fechada tá

play22:16

isso aqui a gente vai ver na próxima

play22:18

aula ou nas

play22:19

próximas Então tá aí fizemos a criação

play22:22

do banco de dados criação de uma tabela

play22:26

inserção de registros cons consultas

play22:28

nesses registros vimos como trabalhar

play22:31

bem sucintamente com gerenciador de

play22:33

contextos como trabalhar com cursor

play22:35

conexão e como fechar a conexão Neste

play22:37

vídeo uma última coisa que eu quero

play22:40

mostrar antes de

play22:41

ir-me existem ferramentas gráficas que a

play22:44

gente pode usar para manipular e

play22:46

gerenciar o banco de dados

play22:48

sqlite claro que se você tá escrevendo

play22:50

script in Python seu objetivo é que o

play22:52

script in Python faça isso para você

play22:53

porque você tem um motivo específico

play22:55

para tal mas as ferramentas gráficas À

play22:58

vezes auxiliam a trabalhar com o banco

play23:01

de dados manipular os dados corrigir

play23:03

erros fazer uma visualização rápida sem

play23:05

precisar rodar os scripts Existem várias

play23:08

ferramentas uma delas é o SQL

play23:11

Studio aqui eu tô na página do github

play23:14

dessa ferramenta que é muito

play23:16

legal eu já baixei inclusive já tenho

play23:19

ela na máquina vou mostrar como é que a

play23:20

gente US ela muito

play23:21

rapidamente existe versão para Windows

play23:24

Mac OS Linux é tanto instalável quanto

play23:27

portable beleza eu tenho aqui a porta na

play23:30

minha máquina é só baixar descompactar

play23:32

numa pasta e utilizar eu vou deixar o

play23:34

link também desse github aqui na

play23:36

descrição do vídeo como é que vai

play23:37

funcionar esta ferramenta vai funcionar

play23:39

assim ó depois que você descompactou eu

play23:41

descompacte na mesma pasta aqui do meu

play23:43

banco de dados mas não precisa estar na

play23:45

mesma pasta pode estar em qualquer lugar

play23:46

do computador então eu vou abrir a

play23:48

ferramenta e vou rodar aqui o seu

play23:50

executável SQL Studio beleza tá aberta

play23:55

aqui a ferramenta aqui em cima eu vou

play23:57

fazer a conexão a um banco de dados eu

play24:00

vou adicionar um banco de dados Olha só

play24:02

clico aqui ele pergunta qual o tipo do

play24:04

banco tá ex tem alguns outros tipos que

play24:06

ele também consegue manipular e aqui em

play24:09

arquivo eu vou clicar na pastinha e vou

play24:11

localizar o banco tá aqui ó Cinema Se

play24:14

tiverem outra pasta é só você Navegar

play24:15

até outra pasta cinema selecionar nome

play24:18

na lista Você pode dar um nome diferente

play24:20

para ele aparecer aqui na lista se

play24:21

quiser e também tem a opção de mantê-lo

play24:23

permanentemente ele fica aqui quando

play24:25

você abrir de novo ele tá aí disponível

play24:27

ainda para você continuar trabalhando

play24:29

testar conexão clico aqui conectou com

play24:31

sucesso então dou ok tá lá o cinema

play24:35

clico duas vezes ele expande ó tabela de

play24:38

filme já tá lá posso expandir a tabela

play24:40

de filme e ver as colunas que ele tem

play24:42

título ano e duração também dá para ver

play24:45

se tem índices ou triggers criados eí se

play24:47

você clicar em cada uma delas duas vezes

play24:49

ele traz os dados da coluna e você pode

play24:51

fazer edições por exemplo selecionar uma

play24:53

coluna para ser chave primária

play24:55

estrangeira constraint Unique not nu

play24:57

valor p ET tamanho tipo de dado que a

play25:00

gente não não associou explicitamente

play25:03

ainda ess aqui são os tipos de classes

play25:05

de dados que o SQL suporta blob integer

play25:08

numeric real e text vamos falar sobre

play25:10

elas também depois certo então tem toda

play25:13

essa opção aqui dentro e além disso a

play25:15

gente tem aqui olha que legal este

play25:17

rolinho aqui é um editor de SQL a gente

play25:20

pode abrir o editor Olha que beleza e

play25:23

digitar SQL aqui por exemplo

play25:27

select

play25:29

from

play25:31

filme quero ver tudo que tem na minha

play25:33

tabela de filme E aí clica no play para

play25:36

rodar ele vai mostrar os filmes que a

play25:39

gente acabou de inserir Olha só estão

play25:40

todos no banco de dadosos anéis com bbar

play25:44

ET até o openheimer que é o mais recente

play25:46

com a sua duração de 180 minutos

play25:49

recomendada inclusive tranquilo gente

play25:52

então tá aí nesse primeiro vídeo um

play25:55

pouquinho extenso até mas introdutório

play25:57

na verdade

play25:58

só com os conceitos iniciais pra gente

play26:00

entender o que que é o sqlite de leve e

play26:03

como trabalhar com um scriptz em Python

play26:05

para começar a manipulação de um

play26:07

banquinho de dados utilizando esse banco

play26:10

de dados que é muito útil para

play26:11

aplicações leves por exemplo aplicações

play26:14

que vão rodar no teu Smartphone ou no

play26:16

teu tablet é muito útil como a gente vai

play26:19

ver em aulas subsequentes e assim espero

play26:22

que o vídeo tenha sido sido útil para

play26:24

vocês e nos próximos vídeos a gente

play26:27

prossegue falando mais sobre esse

play26:29

sistema de banco de dados e aprendendo

play26:31

Como trabalhar com a biblioteca sqlite 3

play26:33

do Python Então é isso aí pessoal espero

play26:37

que vocês tenham gostado desse vídeo

play26:38

aproveitem para se inscrever aqui no

play26:40

canal da Boss no treinamento Se vocês

play26:41

não forem inscritos ainda e se já forem

play26:43

inscritos cliquem no Sininho aqui

play26:44

embaixo para ativar as notificações e

play26:46

assim serem avisados Quando tivermos

play26:48

conteúdo novo postado aqui no canal e se

play26:50

você quiser contribuir com a bosson

play26:52

treinamentos torne-se membro do nosso

play26:53

clube de canais temos o link aqui

play26:55

embaixo na descrição do vídeo e também o

play26:57

botão seja membro do YouTube com as

play26:59

instruções e não deixe de acessar o

play27:01

nosso Website

play27:02

www.bosontreinamentos.com.br

play27:04

além de nos seguir nas redes sociais

play27:06

hein que estão aparecendo aqui em cima

play27:08

obrigado e até a próxima

Rate This

5.0 / 5 (0 votes)

Связанные теги
SQLitePythonDatabase ManagementMobile ApplicationsEmbedded SystemsServerlessTransactionalDynamic TypingData IntegritySQLite3 ModuleGraphical ToolsSQLite Studio
Вам нужно краткое изложение на английском?