Hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) rất phổ biến và là một phần không thể thiếu của phát triển ứng dụng. Có nhiều RDBMS khác nhau, ví dụ như MySQL, PostgreSQL, IBM DB2, Oracle 11g, v.v. Một RDBMS như vậy là SQLite. SQLite được sử dụng rộng rãi và được các nhà phát triển ưa chuộng vì nhiều lý do -
Cực kỳ nhẹ (không quá 500 KB)
Không cần máy chủ (serverless), nghĩa là bạn không cần máy chủ riêng để sử dụng
Không cần thiết lập phức tạp
Hoàn toàn hỗ trợ giao dịch và tuân thủ đồng thời
và còn nhiều nữa...
Tuy nhiên, SQLite cũng có một số hạn chế. Ví dụ, nó không hỗ trợ các phép nối như RIGHT OUTER JOIN và FULL OUTER JOIN. Nhưng ưu điểm vẫn vượt trội so với hạn chế. Trong hướng dẫn này, bạn sẽ được giới thiệu cách dùng SQLite trong Python và dưới đây là tổng quan nội dung sẽ đề cập -
Cài đặt và thiết lập SQLite
Tạo cơ sở dữ liệu và bảng trong SQLite
Nhập tệp .csv vào cơ sở dữ liệu SQLite
SQLite trong Python
Lưu ý: Hướng dẫn này giả định bạn đã quen với những kiến thức cơ bản về SQL (trên bất kỳ RDBMS nào) và Python (3). Nếu muốn ôn lại, các tài nguyên sau có thể hữu ích -
Khi đã thấy thoải mái với SQL và Python, bạn có thể quay lại và tiếp tục từ chỗ đã dừng.
Cài đặt và thiết lập
Cài đặt và thiết lập SQLite chỉ mất vài phút. Bạn có thể dùng SQLite qua công cụ dòng lệnh, nhưng cũng có tiện ích giao diện đồ họa (GUI) cho phép bạn làm việc với SQLite qua một giao diện trực quan. Trong hướng dẫn này, bạn sẽ dùng DB Browser for SQLite. Đầu tiên, hãy tải công cụ này từ đây phù hợp với hệ điều hành của bạn.
Trên Windows 7, giao diện của DB Browser for SQLite trông như sau -
Tạo cơ sở dữ liệu và bảng
Khi đã sẵn sàng với công cụ DB Browser, bạn có thể tạo một cơ sở dữ liệu SQLite mới để tiếp tục. Để làm việc này, nhấp vào thẻ New Database -
Sau khi nhấp vào thẻ New Database, bạn sẽ được yêu cầu nhập tên cho cơ sở dữ liệu. Đặt một tên tùy ý rồi tiếp tục. Một cơ sở dữ liệu trống với tên bạn vừa nhập sẽ được tạo ngay lập tức, và bạn sẽ được nhắc tạo một bảng trong cơ sở dữ liệu đó. Bạn có thể bỏ qua việc tạo bảng lúc này; chúng ta sẽ quay lại ngay.
Để tạo một bảng, bạn cần xác định lược đồ (schema) của bảng. Trong hướng dẫn này và để dễ hiểu, hãy tạo một bảng đơn giản tên là consumers với các trường và kiểu dữ liệu sau -
consumer_id (integer)
consumer_full_name (string) (không được null)
consumer_email (string) (không được null)
consumer_grade (character) (không được null)
Lưu ý: Nếu bạn quen với thiết kế lược đồ cơ sở dữ liệu, bạn sẽ nhận ra trường consumer_id là khóa chính của bảng (vì vậy nó được gạch chân).
Để tạo bảng, nhấp vào thẻ Create Table và bạn sẽ được nhắc nhập chi tiết bảng mà bạn muốn tạo -
Nếu quan sát kỹ hình trên, bạn sẽ thấy nó chứa đúng các chi tiết bạn muốn đưa vào bảng consumers. Bạn cũng có thể thấy câu lệnh SQL tương ứng để tạo bảng. Công cụ DB Browser hỗ trợ việc này rất hiệu quả. Sau khi hoàn tất, hãy nhấp nút OK và bảng consumers sẽ xuất hiện dưới cơ sở dữ liệu bạn đã tạo trước đó -
Bảng sqlite_sequence xuất hiện vì nếu bạn chỉ định trường consumer_id tự động tăng (auto-increment), SQLite sẽ tạo một bảng riêng để quản lý chuỗi số. Bạn cũng có thể thực thi các câu lệnh SQL khác bằng cách vào phần Execute SQL. Cứ thoải mái chạy một vài câu SQL yêu thích.
Trước khi tương tác với cơ sở dữ liệu SQLite bằng Python, hãy xem cách bạn có thể nhập một tệp .csv vào cơ sở dữ liệu SQLite để phục vụ phân tích.
Nhập tệp .csv vào cơ sở dữ liệu SQLite
Để nhập tệp .csv vào cơ sở dữ liệu bạn đã tạo, hãy làm theo điều hướng: File -> Import -> Table from CSV file. Bạn có thể dùng bất kỳ tệp .csv nào cho mục đích này. Tệp trong ví dụ của chúng ta chứa thông tin về các quốc gia trên thế giới. Chúng ta chọn tệp và sẽ thấy một hộp thoại như sau -
DB Browser cho phép bạn chỉ định nhiều thứ ở đây, bao gồm tên bảng. Hãy chắc chắn bạn đánh dấu tùy chọn Column names in the first line để SQLite có thể tự động lấy tên cột. Nhấp OK sau khi hoàn tất thiết lập.
Với ví dụ của chúng ta, bạn sẽ thấy một mục cho bảng -
Bạn có thể chạy một vài truy vấn select để kiểm tra bảng đã được nhập chính xác hay chưa.
SQLite trong Python
Bây giờ bạn đã có sẵn một cơ sở dữ liệu và một bảng để làm việc. Để tương tác với cơ sở dữ liệu SQLite bằng Python, bạn cần mô-đun sqlite3 đi kèm với bản phân phối Anaconda.
Tiếp theo, bạn sẽ kết nối tới cơ sở dữ liệu đã tạo bằng phương thức connect() do sqlite3 cung cấp. Phương thức này trả về một đối tượng Connection. Cung cấp đường dẫn tới cơ sở dữ liệu cho phương thức connect. Các cơ sở dữ liệu thường được lưu với phần mở rộng .db.
import sqlite3
conn = sqlite3.connect('tutorial.db')Được hỗ trợ bởi
Khi đã có Connection tới cơ sở dữ liệu, bạn có thể tạo đối tượng Cursor và gọi phương thức execute() của nó để thực thi các lệnh SQL.
cur = conn.cursor()
cur.execute('SELECT * from countries')Được hỗ trợ bởi
[('NLD','Netherlands','Europe','Western Europe','1581','Nederland','Constitutional Monarchy','Amsterdam'),('ALB','Albania','Europe','Southern Europe','1912','Shqiperia','Republic','Tirane'),('DZA','Algeria','Africa','Northern Africa','1962','Al-Jaza\x92ir/Algerie','Republic','Algiers'),('ASM','American Samoa','Oceania','Polynesia', None,'Amerika Samoa','US Territory','Pago Pago'),('AND','Andorra','Europe','Southern Europe','1278','Andorra','Parliamentary Coprincipality','Andorra la Vella'),('AGO','Angola','Africa','Central Africa','1975','Angola','Republic','Luanda'),('ATG','Antigua and Barbuda','North America','Caribbean','1981','Antigua and Barbuda','Constitutional Monarchy',"Saint John's"),('ARE','United Arab Emirates','Asia','Middle East','1971','Al-Imarat al-´Arabiya al-Muttahida','Emirate Federation','Abu Dhabi'),('ARG','Argentina','South America','South America','1816','Argentina','Federal Republic','Buenos Aires'),('ARM','Armenia','Asia','Middle East','1991','Hajastan','Republic','Yerevan'),('ABW','Aruba','North America','Caribbean', None,'Aruba','Nonmetropolitan Territory of The Netherlands','Oranjestad'),('AUS','Australia','Oceania','Australia and New Zealand','1901','Australia','Constitutional Monarchy, Federation','Canberra'),('AZE','Azerbaijan','Asia','Middle East','1991','Azarbaycan','Federal Republic','Baku'),('BHS','Bahamas','North America','Caribbean','1973','The Bahamas','Constitutional Monarchy','Nassau'),('BHR','Bahrain','Asia','Middle East','1971','Al-Bahrayn','Monarchy (Emirate)','Manama'),('BGD','Bangladesh','Asia','Southern and Central Asia','1971','Bangladesh','Republic','Dhaka'),('BRB','Barbados','North America','Caribbean','1966','Barbados','Constitutional Monarchy','Bridgetown'),('BEL','Belgium','Europe','Western Europe','1830','Belgie/Belgique','Constitutional Monarchy, Federation','Brussels'),('BLZ','Belize','North America','Central America','1981','Belize','Constitutional Monarchy','Belmopan'),('BEN','Benin','Africa','Western Africa','1960','Benin','Republic','Porto-Novo'),('BMU','Bermuda','North America','North America', None,'Bermuda','Dependent Territory of the UK','Hamilton'),('BTN','Bhutan','Asia','Southern and Central Asia','1910','Druk-Yul','Monarchy','Thimphu'),('BOL','Bolivia','South America','South America','1825','Bolivia','Republic','La Paz'),('BIH','Bosnia and Herzegovina','Europe','Southern Europe','1992','Bosna i Hercegovina','Federal Republic','Sarajevo'),('BWA','Botswana','Africa','Southern Africa','1966','Botswana','Republic','Gaborone'),('BRA','Brazil','South America','South America','1822','Brasil','Federal Republic','Brasilia'),('GBR','United Kingdom','Europe','British Islands','1066','United Kingdom','Constitutional Monarchy','London'),('VGB','Virgin Islands, British','North America','Caribbean', None,'British Virgin Islands','Dependent Territory of the UK','Road Town'),('BRN','Brunei','Asia','Southeast Asia','1984','Brunei Darussalam','Monarchy (Sultanate)','Bandar Seri Begawan'),('BGR','Bulgaria','Europe','Eastern Europe','1908','Balgarija','Republic','Sofia'),('BFA','Burkina Faso','Africa','Western Africa','1960','Burkina Faso','Republic','Ouagadougou'),('BDI','Burundi','Africa','Eastern Africa','1962','Burundi/Uburundi','Republic','Bujumbura'),('CYM','Cayman Islands','North America','Caribbean', None,'Cayman Islands','Dependent Territory of the UK','George Town'),('CHL','Chile','South America','South America','1810','Chile','Republic','Santiago'),('CRI','Costa Rica','North America','Central America','1821','Costa Rica','Republic','San Jose'),('DJI','Djibouti','Africa','Eastern Africa','1977','Djibouti/Jibuti','Republic','Djibouti'),('DMA','Dominica','North America','Caribbean','1978','Dominica','Republic','Roseau'),('DOM','Dominican Republic','North America','Caribbean','1844','Republica Dominicana','Republic','Santo Domingo'),('ECU','Ecuador','South America','South America','1822','Ecuador','Republic','Quito'),('EGY','Egypt','Africa','Northern Africa','1922','Misr','Republic','Cairo'),('SLV','El Salvador','North America','Central America','1841','El Salvador','Republic','San Salvador'),('ERI','Eritrea','Africa','Eastern Africa','1993','Ertra','Republic','Asmara'),('ESP','Spain','Europe','Southern Europe','1492','Espana','Constitutional Monarchy','Madrid'),('ZAF','South Africa','Africa','Southern Africa','1910','South Africa','Republic','Pretoria'),('ETH','Ethiopia','Africa','Eastern Africa','-1000','YeItyop´iya','Republic','Addis Ababa'),('FJI','Fiji Islands','Oceania','Melanesia','1970','Fiji Islands','Republic','Suva'),('PHL','Philippines','Asia','Southeast Asia','1946','Pilipinas','Republic','Manila'),('FRO','Faroe Islands','Europe','Nordic Countries', None,'Foroyar','Part of Denmark','Torshavn'),('GAB','Gabon','Africa','Central Africa','1960','Le Gabon','Republic','Libreville'),('GMB','Gambia','Africa','Western Africa','1965','The Gambia','Republic','Banjul'),('GEO','Georgia','Asia','Middle East','1991','Sakartvelo','Republic','Tbilisi'),('GHA','Ghana','Africa','Western Africa','1957','Ghana','Republic','Accra'),('GIB','Gibraltar','Europe','Southern Europe', None,'Gibraltar','Dependent Territory of the UK', None),('GRD','Grenada','North America','Caribbean','1974','Grenada','Constitutional Monarchy',"Saint George's"),('GRL','Greenland','North America','North America', None,'Kalaallit Nunaat/Gronland','Part of Denmark','Nuuk'),('GUM','Guam','Oceania','Micronesia', None,'Guam','US Territory','Agana'),('GTM','Guatemala','North America','Central America','1821','Guatemala','Republic','Guatemala City'),('GIN','Guinea','Africa','Western Africa','1958','Guinee','Republic','Conakry'),('GNB','Guinea-Bissau','Africa','Western Africa','1974','Guine-Bissau','Republic','Bissau'),('GUY','Guyana','South America','South America','1966','Guyana','Republic','Georgetown'),('HTI','Haiti','North America','Caribbean','1804','Haiti/Dayti','Republic','Port-au-Prince'),('HND','Honduras','North America','Central America','1838','Honduras','Republic','Tegucigalpa'),('HKG','Hong Kong','Asia','Eastern Asia', None,'Xianggang/Hong Kong','Special Administrative Region of China', None),('IDN','Indonesia','Asia','Southeast Asia','1945','Indonesia','Republic','Jakarta'),('IND','India','Asia','Southern and Central Asia','1947','Bharat/India','Federal Republic','New Delhi'),('IRQ','Iraq','Asia','Middle East','1932','Al-´Iraq','Republic','Baghdad'),('IRN','Iran','Asia','Southern and Central Asia','1906','Iran','Islamic Republic','Tehran'),('IRL','Ireland','Europe','British Islands','1921','Ireland/Eire','Republic','Dublin'),('ISL','Iceland','Europe','Nordic Countries','1944','Island','Republic','Reykjavik'),('ISR','Israel','Asia','Middle East','1948','Yisra\x92el/Isra\x92il','Republic', None),('ITA','Italy','Europe','Southern Europe','1861','Italia','Republic','Rome'),('AUT','Austria','Europe','Western Europe','1918','Osterreich','Federal Republic','Vienna'),('JAM','Jamaica','North America','Caribbean','1962','Jamaica','Constitutional Monarchy','Kingston'),('JPN','Japan','Asia','Eastern Asia','-660','Nihon/Nippon','Constitutional Monarchy','Tokyo'),('YEM','Yemen','Asia','Middle East','1918','Al-Yaman','Republic',"Sana'a"),('JOR','Jordan','Asia','Middle East','1946','Al-Urdunn','Constitutional Monarchy','Amman'),('KHM','Cambodia','Asia','Southeast Asia','1953','Kampuchea','Constitutional Monarchy','Phnom Penh'),('CMR','Cameroon','Africa','Central Africa','1960','Cameroun/Cameroon','Republic','Yaounde'),('CAN','Canada','North America','North America','1867','Canada','Constitutional Monarchy, Federation','Ottawa'),('CPV','Cape Verde','Africa','Western Africa','1975','Cabo Verde','Republic','Praia'),('KAZ','Kazakhstan','Asia','Southern and Central Asia','1991','Qazaqstan','Republic','Astana'),('KEN','Kenya','Africa','Eastern Africa','1963','Kenya','Republic','Nairobi'),('CAF','Central African Republic','Africa','Central Africa','1960','Centrafrique/Be-Afrika','Republic','Bangui'),('CHN','China','Asia','Eastern Asia','-1523','Zhongquo',"People'sRepublic",'Beijing'),('KGZ','Kyrgyzstan','Asia','Southern and Central Asia','1991','Kyrgyzstan','Republic','Bishkek'),('KIR','Kiribati','Oceania','Micronesia','1979','Kiribati','Republic','Tarawa'),('COL','Colombia','South America','South America','1810','Colombia','Republic','Bogota'),('COM','Comoros','Africa','Eastern Africa','1975','Komori/Comores','Republic','Moroni'),('COG','Congo','Africa','Central Africa','1960','Congo','Republic','Brazzaville'),('COD','Congo, The Democratic Republic of the','Africa','Central Africa','1960','Republique Democratique du Congo','Republic','Kinshasa'),('PRK','North Korea','Asia','Eastern Asia','1948','Choson Minjujuui In´min Konghwaguk (Bukhan)','Socialistic Republic','Pyongyang'),('KOR','South Korea','Asia','Eastern Asia','1948','Taehan Min\x92guk (Namhan)','Republic','Seoul'),('GRC','Greece','Europe','Southern Europe','1830','Ellada','Republic','Athens'),('HRV','Croatia','Europe','Southern Europe','1991','Hrvatska','Republic','Zagreb'),('CUB','Cuba','North America','Caribbean','1902','Cuba','Socialistic Republic','Havana'),('KWT','Kuwait','Asia','Middle East','1961','Al-Kuwayt','Constitutional Monarchy (Emirate)','Kuwait City'),('CYP','Cyprus','Asia','Middle East','1960','Kypros/Kibris','Republic','Nicosia'),('LAO','Laos','Asia','Southeast Asia','1953','Lao','Republic','Vientiane'),('LVA','Latvia','Europe','Baltic Countries','1991','Latvija','Republic','Riga'),('LSO','Lesotho','Africa','Southern Africa','1966','Lesotho','Constitutional Monarchy','Maseru'),('LBN','Lebanon','Asia','Middle East','1941','Lubnan','Republic','Beirut'),('LBR','Liberia','Africa','Western Africa','1847','Liberia','Republic','Monrovia'),('LBY','Libya','Africa','Northern Africa','1951','Libiya','Socialistic State','Tripoli'),('LIE','Liechtenstein','Europe','Western Europe','1806','Liechtenstein','Constitutional Monarchy','Vaduz'),('LTU','Lithuania','Europe','Baltic Countries','1991','Lietuva','Republic','Vilnius'),('LUX','Luxembourg','Europe','Western Europe','1867','Luxembourg/Letzebuerg','Constitutional Monarchy','Luxembourg'),('MAC','Macao','Asia','Eastern Asia', None,'Macau/Aomen','Special Administrative Region of China', None),('MDG','Madagascar','Africa','Eastern Africa','1960','Madagasikara/Madagascar','Federal Republic','Antananarivo'),('MKD','Macedonia','Europe','Southern Europe','1991','Makedonija','Republic','Skopje'),('MWI','Malawi','Africa','Eastern Africa','1964','Malawi','Republic','Lilongwe'),('MDV','Maldives','Asia','Southern and Central Asia','1965','Dhivehi Raajje/Maldives','Republic','Male'),('MYS','Malaysia','Asia','Southeast Asia','1957','Malaysia','Constitutional Monarchy, Federation','Kuala Lumpur'),('MLI','Mali','Africa','Western Africa','1960','Mali','Republic','Bamako'),('MLT','Malta','Europe','Southern Europe','1964','Malta','Republic','Valletta'),('MAR','Morocco','Africa','Northern Africa','1956','Al-Maghrib','Constitutional Monarchy','Rabat'),('MHL','Marshall Islands','Oceania','Micronesia','1990','Marshall Islands/Majol','Republic','Majuro'),('MRT','Mauritania','Africa','Western Africa','1960','Muritaniya/Mauritanie','Republic','Nouakchott'),('MUS','Mauritius','Africa','Eastern Africa','1968','Mauritius','Republic','Port Louis'),('MEX','Mexico','North America','Central America','1810','Mexico','Federal Republic','Mexico City'),('FSM','Micronesia, Federated States of','Oceania','Micronesia','1990','Micronesia','Federal Republic','Palikir'),('MDA','Moldova','Europe','Eastern Europe','1991','Moldova','Republic','Chisinau'),('MCO','Monaco','Europe','Western Europe','1861','Monaco','Constitutional Monarchy','Monaco'),('MNG','Mongolia','Asia','Eastern Asia','1921','Mongol Uls','Republic','Ulaanbaatar'),('MOZ','Mozambique','Africa','Eastern Africa','1975','Mocambique','Republic','Maputo'),('MMR','Myanmar','Asia','Southeast Asia','1948','Myanma Pye','Republic','Naypyidaw'),('NAM','Namibia','Africa','Southern Africa','1990','Namibia','Republic','Windhoek'),('NRU','Nauru','Oceania','Micronesia','1968','Naoero/Nauru','Republic','Yaren District'),('NPL','Nepal','Asia','Southern and Central Asia','1769','Nepal','Constitutional Monarchy','Kathmandu'),('NIC','Nicaragua','North America','Central America','1838','Nicaragua','Republic','Managua'),('NER','Niger','Africa','Western Africa','1960','Niger','Republic','Niamey'),('NGA','Nigeria','Africa','Western Africa','1960','Nigeria','Federal Republic','Abuja'),('NOR','Norway','Europe','Nordic Countries','1905','Norge','Constitutional Monarchy','Oslo'),('CIV',"Cote d'Ivoire",'Africa','Western Africa','1960','Cote d\x92Ivoire','Republic','Yamoussoukro'),('OMN','Oman','Asia','Middle East','1951','´Uman','Monarchy (Sultanate)','Muscat'),('PAK','Pakistan','Asia','Southern and Central Asia','1947','Pakistan','Republic','Islamabad'),('PLW','Palau','Oceania','Micronesia','1994','Belau/Palau','Republic','Koror'),('PAN','Panama','North America','Central America','1903','Panama','Republic','Panama City'),('PNG','Papua New Guinea','Oceania','Melanesia','1975','Papua New Guinea/Papua Niugini','Constitutional Monarchy','Port Moresby'),('PRY','Paraguay','South America','South America','1811','Paraguay','Republic','Asuncion'),('PER','Peru','South America','South America','1821','Peru/Piruw','Republic','Lima'),('MNP','Northern Mariana Islands','Oceania','Micronesia', None,'Northern Mariana Islands','Commonwealth of the US','Saipan'),('PRT','Portugal','Europe','Southern Europe','1143','Portugal','Republic','Lisbon'),('PRI','Puerto Rico','North America','Caribbean', None,'Puerto Rico','Commonwealth of the US','San Juan'),('POL','Poland','Europe','Eastern Europe','1918','Polska','Republic','Warsaw'),('GNQ','Equatorial Guinea','Africa','Central Africa','1968','Guinea Ecuatorial','Republic','Malabo'),('QAT','Qatar','Asia','Middle East','1971','Qatar','Monarchy','Doha'),('FRA','France','Europe','Western Europe','843','France','Republic','Paris'),('PYF','French Polynesia','Oceania','Polynesia', None,'Polynesie francaise','Nonmetropolitan Territory of France','Papeete'),('RWA','Rwanda','Africa','Eastern Africa','1962','Rwanda/Urwanda','Republic','Kigali'),('SWE','Sweden','Europe','Nordic Countries','836','Sverige','Constitutional Monarchy','Stockholm'),('KNA','Saint Kitts and Nevis','North America','Caribbean','1983','Saint Kitts and Nevis','Constitutional Monarchy','Basseterre'),('LCA','Saint Lucia','North America','Caribbean','1979','Saint Lucia','Constitutional Monarchy','Castries'),('VCT','Saint Vincent and the Grenadines','North America','Caribbean','1979','Saint Vincent and the Grenadines','Constitutional Monarchy','Kingstown'),('DEU','Germany','Europe','Western Europe','1955','Deutschland','Federal Republic','Berlin'),('SLB','Solomon Islands','Oceania','Melanesia','1978','Solomon Islands','Constitutional Monarchy','Honiara'),('ZMB','Zambia','Africa','Eastern Africa','1964','Zambia','Republic','Lusaka'),('WSM','Samoa','Oceania','Polynesia','1962','Samoa','Parlementary Monarchy','Apia'),('SMR','San Marino','Europe','Southern Europe','885','San Marino','Republic','San Marino'),('STP','Sao Tome and Principe','Africa','Central Africa','1975','Sao Tome e Principe','Republic','Sao Tome'),('SAU','Saudi Arabia','Asia','Middle East','1932','Al-´Arabiya as-Sa´udiya','Monarchy','Riyadh'),('SEN','Senegal','Africa','Western Africa','1960','Senegal/Sounougal','Republic','Dakar'),('SYC','Seychelles','Africa','Eastern Africa','1976','Sesel/Seychelles','Republic','Victoria'),('SLE','Sierra Leone','Africa','Western Africa','1961','Sierra Leone','Republic','Freetown'),('SGP','Singapore','Asia','Southeast Asia','1965','Singapore/Singapura/Xinjiapo/Singapur','Republic','Singapore'),('SVK','Slovakia','Europe','Eastern Europe','1993','Slovensko','Republic','Bratislava'),('SVN','Slovenia','Europe','Southern Europe','1991','Slovenija','Republic','Ljubljana'),('SOM','Somalia','Africa','Eastern Africa','1960','Soomaaliya','Republic','Mogadishu'),('LKA','Sri Lanka','Asia','Southern and Central Asia','1948','Sri Lanka/Ilankai','Republic','Colombo'),('SDN','Sudan','Africa','Northern Africa','1956','As-Sudan','Islamic Republic','Khartoum'),('FIN','Finland','Europe','Nordic Countries','1917','Suomi','Republic','Helsinki'),('SUR','Suriname','South America','South America','1975','Suriname','Republic','Paramaribo'),('SWZ','Swaziland','Africa','Southern Africa','1968','kaNgwane','Monarchy','Mbabane'),('CHE','Switzerland','Europe','Western Europe','1499','Schweiz/Suisse/Svizzera/Svizra','Federation','Bern'),('SYR','Syria','Asia','Middle East','1941','Suriya','Republic','Damascus'),('TJK','Tajikistan','Asia','Southern and Central Asia','1991','Tocikiston','Republic','Dushanbe'),('TZA','Tanzania','Africa','Eastern Africa','1961','Tanzania','Republic','Dodoma'),('DNK','Denmark','Europe','Nordic Countries','800','Danmark','Constitutional Monarchy','Copenhagen'),('THA','Thailand','Asia','Southeast Asia','1350','Prathet Thai','Constitutional Monarchy','Bangkok'),('TGO','Togo','Africa','Western Africa','1960','Togo','Republic','Lome'),('TON','Tonga','Oceania','Polynesia','1970','Tonga','Monarchy',"Nuku'alofa"),('TTO','Trinidad and Tobago','North America','Caribbean','1962','Trinidad and Tobago','Republic','Port-of-Spain'),('TCD','Chad','Africa','Central Africa','1960','Tchad/Tshad','Republic',"N'Djamena"),('CZE','Czech Republic','Europe','Eastern Europe','1993','¸esko','Republic','Prague'),('TUN','Tunisia','Africa','Northern Africa','1956','Tunis/Tunisie','Republic','Tunis'),('TUR','Turkey','Asia','Middle East','1923','Turkiye','Republic','Ankara'),('TKM','Turkmenistan','Asia','Southern and Central Asia','1991','Turkmenostan','Republic','Ashgabat'),('TCA','Turks and Caicos Islands','North America','Caribbean', None,'The Turks and Caicos Islands','Dependent Territory of the UK','Grand Turk'),('TUV','Tuvalu','Oceania','Polynesia','1978','Tuvalu','Constitutional Monarchy','Funafuti'),('UGA','Uganda','Africa','Eastern Africa','1962','Uganda','Republic','Kampala'),('UKR','Ukraine','Europe','Eastern Europe','1991','Ukrajina','Republic','Kiev'),('HUN','Hungary','Europe','Eastern Europe','1918','Magyarorszag','Republic','Budapest'),('URY','Uruguay','South America','South America','1828','Uruguay','Republic','Montevideo'),('NCL','New Caledonia','Oceania','Melanesia', None,'Nouvelle-Caledonie','Nonmetropolitan Territory of France',"Noum'ea"),('NZL','New Zealand','Oceania','Australia and New Zealand','1907','New Zealand/Aotearoa','Constitutional Monarchy','Wellington'),('UZB','Uzbekistan','Asia','Southern and Central Asia','1991','Uzbekiston','Republic','Tashkent'),('BLR','Belarus','Europe','Eastern Europe','1991','Belarus','Republic','Minsk'),('VUT','Vanuatu','Oceania','Melanesia','1980','Vanuatu','Republic','Port-Vila'),('VEN','Venezuela','South America','South America','1811','Venezuela','Federal Republic','Caracas'),('RUS','Russian Federation','Europe','Eastern Europe','1991','Rossija','Federal Republic','Moscow'),('VNM','Vietnam','Asia','Southeast Asia','1945','Viet Nam','Socialistic Republic','Hanoi'),('EST','Estonia','Europe','Baltic Countries','1991','Eesti','Republic','Tallinn'),('USA','United States','North America','North America','1776','United States','Federal Republic','Washington D.C.'),('VIR','Virgin Islands, U.S.','North America','Caribbean', None,'Virgin Islands of the United States','US Territory','Charlotte Amalie'),('ZWE','Zimbabwe','Africa','Eastern Africa','1980','Zimbabwe','Republic','Harare'),('PSE','Palestine','Asia','Middle East', None,'Filastin','Autonomous Area', None)]Được hỗ trợ bởi
Bạn có thể làm cho đầu ra của phương thức fetchall() dễ nhìn hơn một chút bằng cách lặp qua từng hàng -
for row in cur.execute('SELECT * FROM countries'):print(row)Được hỗ trợ bởi
('AFG','Afghanistan','Asia','Southern and Central Asia','1919','Afganistan/Afqanestan','Islamic Emirate','Kabul')('NLD','Netherlands','Europe','Western Europe','1581','Nederland','Constitutional Monarchy','Amsterdam')('ALB','Albania','Europe','Southern Europe','1912','Shqiperia','Republic','Tirane')...('USA','United States','North America','North America','1776','United States','Federal Republic','Washington D.C.')('VIR','Virgin Islands, U.S.','North America','Caribbean', None,'Virgin Islands of the United States','US Territory','Charlotte Amalie')('ZWE','Zimbabwe','Africa','Eastern Africa','1980','Zimbabwe','Republic','Harare')('PSE','Palestine','Asia','Middle East', None,'Filastin','Autonomous Area', None)Được hỗ trợ bởi
Bây giờ hãy xem cách thêm mệnh đề where vào truy vấn và thực thi. Hãy lấy thông tin của quốc gia có code = 'AFG'.
code =('AFG',)
cur.execute('SELECT * FROM countries WHERE code = ?', code)print(cur.fetchone())Được hỗ trợ bởi
('AFG','Afghanistan','Asia','Southern and Central Asia','1919','Afganistan/Afqanestan','Islamic Emirate','Kabul')Được hỗ trợ bởi
Bạn cũng có thể làm như sau để lấy bản ghi, nhưng cách trên an toàn hơn.
code ='AFG'
cur.execute("SELECT * FROM countries WHERE code = '%s'"% code)print(cur.fetchone())Được hỗ trợ bởi
('AFG','Afghanistan','Asia','Southern and Central Asia','1919','Afganistan/Afqanestan','Islamic Emirate','Kabul')Được hỗ trợ bởi
Bạn có thể chèn bản ghi vào bảng từng cái một hoặc nhiều bản ghi cùng lúc. Cho việc này, hãy dùng bảng consumers. Hiện tại nó chưa có bản ghi nào. Hãy điền dữ liệu từ đây.
# One by one
cur.execute("INSERT INTO consumers VALUES (1,'John Doe','[email protected]','A')")for row in cur.execute('SELECT * FROM consumers'):print(row)Được hỗ trợ bởi
# Prepare a list of records to be inserted
purchases =[(2,'John Paul','[email protected]','B'),(3,'Chris Paul','[email protected]','A'),]# Use executemany() to insert multiple records at a time
cur.executemany('INSERT INTO consumers VALUES (?,?,?,?)', purchases)for row in cur.execute('SELECT * FROM consumers'):print(row)Được hỗ trợ bởi
Bạn có thể kiểm tra chéo điều này trên công cụ DB Browser; các bản ghi cũng sẽ hiển thị ở đó. Điều này sẽ không xảy ra trừ khi bạn thực hiện commit các giao dịch. Bạn có thể commit/lưu lại chỉ bằng cách gọi phương thức commit() của đối tượng Connection bạn đã tạo.
Là một thói quen lập trình tốt, hãy đóng kết nối CSDL khi hoàn tất công việc. Nhưng trước đó, các thay đổi cần được ghi nhận vĩnh viễn, điều này được thực hiện bằng phương thức commit() như đã minh họa ở trên.
Cảm ơn bạn đã đọc hết hướng dẫn. Hướng dẫn này đã giới thiệu SQLite, một RDBMS mạnh mẽ nhưng nhẹ, và bạn đã học cách tương tác với SQLite bằng Python. Hãy cho tôi biết nếu bạn có câu hỏi trong phần bình luận.
Hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) rất phổ biến và là một phần không thể thiếu của phát triển ứng dụng. Có nhiều RDBMS khác nhau, ví dụ như MySQL, PostgreSQL, IBM DB2, Oracle 11g, v.v. Một RDBMS như vậy là SQLite. SQLite được sử dụng rộng rãi và được các nhà phát triển ưa chuộng vì nhiều lý do -
Tuy nhiên, SQLite cũng có một số hạn chế. Ví dụ, nó không hỗ trợ các phép nối như
RIGHT OUTER JOINvàFULL OUTER JOIN. Nhưng ưu điểm vẫn vượt trội so với hạn chế. Trong hướng dẫn này, bạn sẽ được giới thiệu cách dùng SQLite trong Python và dưới đây là tổng quan nội dung sẽ đề cập -Lưu ý: Hướng dẫn này giả định bạn đã quen với những kiến thức cơ bản về SQL (trên bất kỳ RDBMS nào) và Python (3). Nếu muốn ôn lại, các tài nguyên sau có thể hữu ích -
Khi đã thấy thoải mái với SQL và Python, bạn có thể quay lại và tiếp tục từ chỗ đã dừng.
Cài đặt và thiết lập
Cài đặt và thiết lập SQLite chỉ mất vài phút. Bạn có thể dùng SQLite qua công cụ dòng lệnh, nhưng cũng có tiện ích giao diện đồ họa (GUI) cho phép bạn làm việc với SQLite qua một giao diện trực quan. Trong hướng dẫn này, bạn sẽ dùng DB Browser for SQLite. Đầu tiên, hãy tải công cụ này từ đây phù hợp với hệ điều hành của bạn.
Trên Windows 7, giao diện của DB Browser for SQLite trông như sau -
Tạo cơ sở dữ liệu và bảng
Khi đã sẵn sàng với công cụ DB Browser, bạn có thể tạo một cơ sở dữ liệu SQLite mới để tiếp tục. Để làm việc này, nhấp vào thẻ New Database -
Sau khi nhấp vào thẻ New Database, bạn sẽ được yêu cầu nhập tên cho cơ sở dữ liệu. Đặt một tên tùy ý rồi tiếp tục. Một cơ sở dữ liệu trống với tên bạn vừa nhập sẽ được tạo ngay lập tức, và bạn sẽ được nhắc tạo một bảng trong cơ sở dữ liệu đó. Bạn có thể bỏ qua việc tạo bảng lúc này; chúng ta sẽ quay lại ngay.
Để tạo một bảng, bạn cần xác định lược đồ (schema) của bảng. Trong hướng dẫn này và để dễ hiểu, hãy tạo một bảng đơn giản tên là consumers với các trường và kiểu dữ liệu sau -
Lưu ý: Nếu bạn quen với thiết kế lược đồ cơ sở dữ liệu, bạn sẽ nhận ra trường consumer_id là khóa chính của bảng (vì vậy nó được gạch chân).
Để tạo bảng, nhấp vào thẻ Create Table và bạn sẽ được nhắc nhập chi tiết bảng mà bạn muốn tạo -
Nếu quan sát kỹ hình trên, bạn sẽ thấy nó chứa đúng các chi tiết bạn muốn đưa vào bảng consumers. Bạn cũng có thể thấy câu lệnh SQL tương ứng để tạo bảng. Công cụ DB Browser hỗ trợ việc này rất hiệu quả. Sau khi hoàn tất, hãy nhấp nút OK và bảng consumers sẽ xuất hiện dưới cơ sở dữ liệu bạn đã tạo trước đó -
Bảng sqlite_sequence xuất hiện vì nếu bạn chỉ định trường
consumer_idtự động tăng (auto-increment), SQLite sẽ tạo một bảng riêng để quản lý chuỗi số. Bạn cũng có thể thực thi các câu lệnh SQL khác bằng cách vào phần Execute SQL. Cứ thoải mái chạy một vài câu SQL yêu thích.Trước khi tương tác với cơ sở dữ liệu SQLite bằng Python, hãy xem cách bạn có thể nhập một tệp .csv vào cơ sở dữ liệu SQLite để phục vụ phân tích.
Nhập tệp .csv vào cơ sở dữ liệu SQLite
Để nhập tệp .csv vào cơ sở dữ liệu bạn đã tạo, hãy làm theo điều hướng: File -> Import -> Table from CSV file. Bạn có thể dùng bất kỳ tệp .csv nào cho mục đích này. Tệp trong ví dụ của chúng ta chứa thông tin về các quốc gia trên thế giới. Chúng ta chọn tệp và sẽ thấy một hộp thoại như sau -
DB Browser cho phép bạn chỉ định nhiều thứ ở đây, bao gồm tên bảng. Hãy chắc chắn bạn đánh dấu tùy chọn Column names in the first line để SQLite có thể tự động lấy tên cột. Nhấp OK sau khi hoàn tất thiết lập.
Với ví dụ của chúng ta, bạn sẽ thấy một mục cho bảng -
Bạn có thể chạy một vài truy vấn
selectđể kiểm tra bảng đã được nhập chính xác hay chưa.SQLite trong Python
Bây giờ bạn đã có sẵn một cơ sở dữ liệu và một bảng để làm việc. Để tương tác với cơ sở dữ liệu SQLite bằng Python, bạn cần mô-đun sqlite3 đi kèm với bản phân phối Anaconda.
Tiếp theo, bạn sẽ kết nối tới cơ sở dữ liệu đã tạo bằng phương thức
connect()dosqlite3cung cấp. Phương thức này trả về một đối tượngConnection. Cung cấp đường dẫn tới cơ sở dữ liệu cho phương thứcconnect. Các cơ sở dữ liệu thường được lưu với phần mở rộng.db.Khi đã có
Connectiontới cơ sở dữ liệu, bạn có thể tạo đối tượngCursorvà gọi phương thứcexecute()của nó để thực thi các lệnh SQL.Sau khi thực thi câu lệnh
SELECT, bạn có thể -curnhư một iterator, gọi phương thứcfetchone()để hiển thị một hàng hoặcfetchall()để hiển thị danh sách các hàngHãy thử cả hai lần lượt.
Bạn có thể làm cho đầu ra của phương thức
fetchall()dễ nhìn hơn một chút bằng cách lặp qua từng hàng -Bây giờ hãy xem cách thêm mệnh đề
wherevào truy vấn và thực thi. Hãy lấy thông tin của quốc gia cócode = 'AFG'.Bạn cũng có thể làm như sau để lấy bản ghi, nhưng cách trên an toàn hơn.
Bạn có thể chèn bản ghi vào bảng từng cái một hoặc nhiều bản ghi cùng lúc. Cho việc này, hãy dùng bảng
consumers. Hiện tại nó chưa có bản ghi nào. Hãy điền dữ liệu từ đây.Bạn có thể kiểm tra chéo điều này trên công cụ DB Browser; các bản ghi cũng sẽ hiển thị ở đó. Điều này sẽ không xảy ra trừ khi bạn thực hiện commit các giao dịch. Bạn có thể commit/lưu lại chỉ bằng cách gọi phương thức
commit()của đối tượngConnectionbạn đã tạo.Bây giờ bạn sẽ thấy các mục đã được thêm -
Là một thói quen lập trình tốt, hãy đóng kết nối CSDL khi hoàn tất công việc. Nhưng trước đó, các thay đổi cần được ghi nhận vĩnh viễn, điều này được thực hiện bằng phương thức
commit()như đã minh họa ở trên.Chúc mừng!
Cảm ơn bạn đã đọc hết hướng dẫn. Hướng dẫn này đã giới thiệu SQLite, một RDBMS mạnh mẽ nhưng nhẹ, và bạn đã học cách tương tác với SQLite bằng Python. Hãy cho tôi biết nếu bạn có câu hỏi trong phần bình luận.
Nếu bạn muốn tìm hiểu thêm về tương tác với cơ sở dữ liệu trong Python, hãy tham gia khóa học Introduction to Databases in Python của DataCamp. Xem thêm hướng dẫn Beginners Guide to SQLite của chúng tôi.