Veritabanları ve SQL Veritabanı , verileri depolamak için düzenlenen bir dosyadır . Çoğu veri tabanı, anahtarlar ve değerler arasında ilişkilendirme yapmaları anlamında sözlükler gibi düzenlenir. En önemli fark, veritabanının diskte (veya başka bir kalıcı depoda) olması, dolayısıyla içeriğinin programdan çıktıktan sonra korunmasıdır. Veritabanı kalıcı depolamada tutulduğundan, bilgisayarın belleğinin boyutuyla sınırlı olan bir sözlükten çok daha fazla veri depolayabilir. Bir sözlük […]
19 Ocak 2022 - 8:00 'de eklendi ve 184 kez görüntülendi. A+A-
Veritabanı , verileri depolamak için düzenlenen bir dosyadır . Çoğu veri tabanı, anahtarlar ve değerler arasında ilişkilendirme yapmaları anlamında sözlükler gibi düzenlenir. En önemli fark, veritabanının diskte (veya başka bir kalıcı depoda) olması, dolayısıyla içeriğinin programdan çıktıktan sonra korunmasıdır. Veritabanı kalıcı depolamada tutulduğundan, bilgisayarın belleğinin boyutuyla sınırlı olan bir sözlükten çok daha fazla veri depolayabilir.
Bir sözlük gibi, veritabanı yazılımı da büyük miktarda veri için bile veri girişi ve erişimi çok hızlı yapmak için tasarlanmıştır. Bu yazılım, bilgisayarın belirli bir girişe hızlı bir şekilde atlamasını sağlayan veritabanına eklenen veriler gibi dizinler oluşturarak performansını korur.
Çok çeşitli amaçlar için kullanılan birçok farklı veritabanı sistemi vardır. Bunlardan bazıları: Oracle, MySQL, Microsoft SQL Server, PostgreSQL ve SQLite. Bu kitapta SQLite çok yaygın bir veritabanı olduğu ve Python’da yerleşik olduğu için odaklanacağız. SQLite, diğer uygulamaların içine gömülmek üzere tasarlanmıştır ve uygulama içinde veritabanı desteği sağlar. Örneğin, Firefox tarayıcısı, diğer birçok ürün gibi SQLite veritabanını dahili olarak kullananlardan biridir.
SQLite, önceki bölümde tanımladığımız Twitter izleme uygulaması gibi bilgi işlemde karşılaştığımız belirli veri işleme sorunlarına çok uygundur.
Bir veritabanını ilk gördüğünüzde, birden çok sayfa içeren bir elektronik tablo gibi görünür. Bir veritabanındaki birincil veri yapıları şunlardır: tablolar , dosyalar ve sütunlar .
İlişkisel veritabanlarının teknik açıklamalarında, tablo, satır ve sütun kavramlarına sırasıyla daha resmi ilişki , tuple ve öznitelik adları verilir . Bu bölümde daha az resmi terimleri kullanacağız.
Bu bölümde, SQLite veritabanı dosyalarındaki verilerle çalışmak için Python’u kullanmaya odaklanacak olsak da, aşağıdakilerden ücretsiz olarak indirilebilen Database Browser for SQLite adlı bir yazılım programı kullanılarak birçok işlem daha verimli bir şekilde yapılabilir:
Tarayıcıyı kullanarak tablolar oluşturabilir, veri ekleyebilir, verileri düzenleyebilir veya veritabanında basit SQL sorguları çalıştırabilirsiniz.
Bir bakıma Veritabanı Tarayıcısı, metin dosyalarıyla çalışan bir metin düzenleyiciye benzer. Bir metin dosyasında bir veya iki değişiklik yapmak istediğinizde, yapılacak en kolay şey onu bir metin düzenleyicide açmak ve istediğiniz değişiklikleri yapmaktır. Dosyada çok fazla değişiklik yapmanız gerektiğinde, genellikle basit bir Python programı yazmak gerekecektir. Aynı yaklaşım veritabanlarıyla çalışmaya da uygulanabilir. En basit işlemler veritabanı yöneticisinde gerçekleştirilecek ve daha karmaşık işlemler için Python kullanmak daha uygun olacaktır.
Bir tablo oluşturduğumuzda, veritabanına o tablonun her bir sütununun adını ve her birinde depolanacak verilerin türünü önceden belirtmeliyiz. Veritabanı yazılımı her sütunun veri türünü bildiğinde, içerdikleri veri türüne göre bunları depolamak ve aramak için en verimli yolu seçebilir.
SQLite tarafından desteklenen farklı veri türlerini aşağıdaki adresten inceleyebilirsiniz:
Verileriniz için önceden bir yapı tanımlamanız gerekmeyebilir, ancak ödül, veri tabanı büyük miktarda içerdiğinde bile verilerinize hızlı erişimdir.
Canciones
Veritabanında iki sütunlu bir veritabanı dosyası ve adlandırılmış tablo oluşturma kodu aşağıdaki gibidir:
import sqlite3
conn = sqlite3.connect('musica.sqlite')
cur = conn.cursor()
cur.execute('DROP TABLE IF EXISTS Canciones')
cur.execute('CREATE TABLE Canciones (titulo TEXT, reproducciones INTEGER)')
conn.close()
# Código: https://es.py4e.com/code3/db1.py
İşlem , geçerli dizindeki connect
dosyada depolanan veritabanıyla bağlantı kurar . musica.sqlite
Dosya yoksa, yeni bir tane oluşturulur. Buna “bağlantı” denmesinin nedeni, bazen veritabanının, uygulamamızın çalıştığı sunucudan farklı bir “veritabanı sunucusunda” depolanmasıdır. Örneklerimizde, basit oldukları için veritabanı, Python kodunun çalıştığı dizinde yerel bir dosya olacaktır.
İmleç , bir dosya tanıtıcısı gibidir ve veritabanında depolanan veriler üzerinde işlemler gerçekleştirmek için kullanılabilir. Çağrı , metin dosyalarıyla uğraşırken cursor()
kavramsal olarak çağrıya çok benzer .open()
İmleç elimizde olduğunda, veritabanının içeriği üzerinde komutları execute()
.
Veritabanı komutları, hepsi için tek bir dil öğrenmemize izin vermek için birkaç farklı veritabanı satıcısı arasında standartlaştırılmış özel bir dilde ifade edilir. Bu dile Yapılandırılmış Sorgu Dili veya SQL denir .
Örneğimizde, veritabanı üzerinde iki SQL komutu çalıştırıyoruz. Kural olarak, SQL anahtar sözcüklerini büyük harfle göstereceğiz ve eklediğimiz komutların bölümleri (tablo ve sütun adları gibi) küçük harfle gösterilecektir.
Canciones
Zaten varsa , ilk SQL komutu tabloyu bırakır . Canciones
Bu yaklaşım, aynı programı bir hataya neden olmadan tekrar tekrar oluşturmak için aynı programı çalıştırmamıza izin vermek için kullanılır . Komutun DROP TABLE
tabloyu ve tüm içeriğini veritabanından sildiğine dikkat edin (yani, burada “geri al” seçeneği yoktur).
cur.execute('DROP TABLE IF EXISTS Canciones ')
İkinci komut, adlı Canciones
bir metin sütunu titulo
ve adlı bir tamsayı sütunu ile çağrılan bir tablo oluşturur reproducciones
.
cur.execute('CREATE TABLE Canciones (titulo TEXT, reproducciones INTEGER)')
Adlı tabloyu oluşturduğumuza göre Canciones
, SQL işlemini kullanarak bazı verileri bu tabloya kaydedebiliriz INSERT
. Veritabanına tekrar bağlantı kurarak ve cursor
. Daha sonra bu imleci kullanarak SQL komutlarını çalıştırabiliriz.
SQL komutu INSERT
, hangi tablonun kullanıldığını söyler ve ardından yeni bir satır tanımlar, eklemek istediğiniz alanları ve ardından o satıra koymak istediğiniz (titulo, reproducciones)
değerleri ( ) listeler. Çağrının ikinci parametresinde gerçek değerlerin tuple olarak iletileceğini anlatmak VALUES
için değerleri soru işareti olarak belirteceğiz .(?, ?)
( 'My Way', 15 )
execute()
import sqlite3
conn = sqlite3.connect('musica.sqlite')
cur = conn.cursor()
cur.execute('INSERT INTO Canciones (titulo, reproducciones) VALUES (?, ?)',
('Thunderstruck', 20))
cur.execute('INSERT INTO Canciones (titulo, reproducciones) VALUES (?, ?)',
('My Way', 15))
conn.commit()
print('Canciones:')
cur.execute('SELECT titulo, reproducciones FROM Canciones')
for fila in cur:
print(fila)
cur.execute('DELETE FROM Canciones WHERE reproducciones < 100')
conn.commit()
cur.close()
# Código: https://es.py4e.com/code3/db2.py
Önce INSERT
tabloya iki satır ( ) ekliyoruz commit()
ve veriyi veritabanı dosyasına yazılmaya zorlamak için kullanıyoruz.
SELECT
Ardından , tabloya yeni eklediğimiz satırları almak için komutu kullanırız . Komutta SELECT
, hangi sütunları almak (titulo, reproducciones)
istediğimizi ve ayrıca hangi tablodan veri almak istediğimizi belirtiyoruz. İfadeyi yürüttükten sonra SELECT
, imleç, bir ifadeyle yineleyebileceğimiz bir şey haline gelir for
. Verimlilik için, deyim yürütüldüğünde imleç veritabanındaki tüm verileri okumaz SELECT
. Bunun yerine veriler, ifadeyle oluşturulan döngüden satırlar istendiğinde okunur for
.
Programın çıktısı aşağıdaki gibidir:
Canciones:
('Thunderstruck', 20)
('My Way', 15)
Döngümüz for
iki satır bulur ve her satır, ilk değeri titulo
ve ikincisi sayısı olan bir Python demetidir reproducciones
.
Not: u'
Başka kitaplarda veya internette ile başlayan dizeler görebilirsiniz. Bu, Python 2’deki dizelerin Latin olmayan karakterleri depolayabilen Unicode dizeleri olduğuna dair bir ipucudur. Python 3’te tüm dizeler Unicode
varsayılan türdedir.
Programın sonunda, programı DELETE
tekrar tekrar çalıştırabilmemiz için yeni oluşturduğumuz dosyaları silmek ( ) için bir SQL komutu çalıştırıyoruz. Komut bize, bir seçim ölçütünü ifade etmemize izin veren DELETE
yan tümcenin kullanımını gösterir WHERE
, böylece veritabanından komutu yalnızca bu ölçütü karşılayan satırlara uygulamasını isteyebiliriz. Bu örnekte tüm satırlar için kriterler karşılanıyor, bu yüzden programı tekrar tekrar çalıştırabilmemiz için tabloyu boşaltıyoruz. Bu yapıldıktan sonra, verileri veritabanından kaldırmaya zorlamak için DELETE
tekrar çağırıyoruz .commit()
Şimdiye kadar Python örneklerimizde Structured Query Language (SQL) kullandık ve birçok temel SQL komutunu kullandık. Bu bölümde özellikle SQL diline odaklanacağız ve sözdizimine bir göz atacağız.
Birçok veritabanı satıcısı olduğu için, Structured Query Language (SQL) standartlaştırılmıştır, böylece birden fazla satıcının veritabanı sistemleriyle benzer şekilde iletişim kurabiliriz.
İlişkisel bir veritabanı tablolardan, satırlardan ve sütunlardan oluşur. Sütunlar genellikle metin, sayı veya tarih verisi olabilen bir veri türüne sahiptir. Bir tablo oluşturulduğunda, her sütunun adları ve türleri belirtilir:
CREATE TABLE Canciones (titulo TEXT, reproducciones INTEGER)
Bir tabloya satır eklemek için SQL komutunu kullanırız INSERT
:
INSERT INTO Canciones (titulo, reproducciones) VALUES ('My Way', 15)
İfade INSERT
, tablonun adını, ardından yeni satırda ayarlamak istediğiniz alanların/sütunların bir listesini, ardından anahtar kelimeyi VALUES
ve alanların her biri için karşılık gelen değerlerin bir listesini belirtir.
SQL komutu SELECT
, bir veritabanından satır ve sütunları almak için kullanılır. İfade , hangi satırları almak istediğinizi belirten SELECT
bir yan tümce ile birlikte hangi sütunları almak istediğinizi belirtmenize olanak tanır WHERE
. Ayrıca ORDER BY
, döndürülen dosyaların sırasını kontrol etmek için isteğe bağlı bir maddeye izin verir.
SELECT * FROM Canciones WHERE titulo = 'My Way'
kullanımı *
, veritabanının yan tümcenin koşulunu karşılayan her satır için tüm sütunları döndürmesini istediğinizi belirtir WHERE
.
Python’dan farklı olarak, SQL’de yan WHERE
tümcenin bir eşitlik kontrolünü belirtmek için bir çift eşittir işareti kullanmak yerine tek bir eşittir işareti kullandığını unutmayın. Bir yan tümcede izin verilen diğer mantıksal işlemler, mantıksal ifadeler oluşturmak WHERE
için <
, >
, <=
, >=
, !=
ve ayrıca AND
and OR
, ve parantezlerdir.
Döndürülen sütunların aşağıdaki gibi alanlardan birine göre sıralanmasını isteyebilirsiniz:
SELECT titulo,reproducciones FROM Canciones ORDER BY titulo
Bir satırı silmek için SQL deyiminde WHERE
bir yan tümce kullanmak gerekir. DELETE
Yan tümce WHERE
, hangi satırların silineceğini belirler:
DELETE FROM Canciones WHERE titulo = 'My Way'
Aşağıda gösterildiği gibi UPDATE
SQL dizisini kullanarak bir tablodaki bir veya daha fazla satırın bir veya daha fazla sütununu güncellemek ( ) mümkündür :UPDATE
UPDATE Canciones SET reproducciones = 16 WHERE titulo = 'My Way'
İfade UPDATE
bir tablo, ardından anahtar kelimeden sonra değiştirilecek alanların ve değerlerin bir listesini ve son olarak hangi satırların güncelleneceğini seçmek SET
için isteğe bağlı bir yan tümceyi belirtir. WHERE
Tek bir ifade UPDATE
, yan tümceyle eşleşen tüm satırları değiştirir WHERE
. Herhangi bir yan tümce belirtilmemişse WHERE
, tablonun tüm satırlarının güncellemesi ( UPDATE
) gerçekleştirilecektir.
Veri oluşturmak ve sürdürmek için gerekli dört temel işlemi gerçekleştirmemize izin veren dört temel SQL komutu (INSERT, SELECT, UPDATE ve DELETE) vardır.
Bu bölümde Twitter hesapları arasında gezinip bir veritabanı oluşturacak basit bir örümcek programı oluşturacağız. Not: Bu programı çalıştırırken çok dikkatli olun. Çok fazla veri çıkarırsanız veya programı çok uzun süre çalıştırırsanız, sizi Twitter’dan uzaklaştırabilirler.
Herhangi bir tür örümcek programıyla ilgili sorunlardan biri, onu birçok kez durdurabilmeniz ve yeniden başlatabilmeniz ve o ana kadar kurtarılan verileri kaybetmek istememenizdir. Veri kurtarmayı her zaman en baştan başlatmak zorunda kalmak istemezsiniz, bu nedenle programımızın bu yedeklemeyi kullanabilmesi ve veri toplamaya kaldığı yerden devam edebilmesi için verileri kurtardıkça saklamamız gerekir.
Bir kişinin Twitter arkadaşlarını ve durumlarını alarak, arkadaş listesinde dolaşarak ve gelecekte geri almak için her birini veritabanına ekleyerek başlayalım. Bu kişinin tüm arkadaşlarını işledikten sonra, veritabanını sorgulayacağız ve bu arkadaşlardan birinin arkadaşlarını alacağız. Bunu tekrar tekrar yapmaya devam edeceğiz, “ziyaret edilmemiş” kişileri alarak, onların arkadaş listelerini alarak ve zaten sahip olmadıklarımızı gelecekteki bir ziyaret için listemize ekleyeceğiz.
Ayrıca “popülerliği” hakkında bir fikir edinmek için veri tabanında belirli bir arkadaşı kaç kez gördüğümüzü de sayacağız.
Hesabı kurtarmış olsak da olmasak da tanıdık hesaplar listemizi ve her hesabın popülerliğini saklıyoruz. Tüm bunları bilgisayarımızdaki bir veritabanına kaydederek, programı istediğimiz kadar durdurabilir ve devam ettirebiliriz.
Bu program biraz karmaşık. Twitter API’sini kullanan kitaptaki daha önceki bir alıştırmadan alınan koda dayanmaktadır.
İşte Twitter örümcek uygulamamızın kaynak kodu:
from urllib.request import urlopen
import urllib.error
import twurl
import json
import sqlite3
import ssl
TWITTER_URL = 'https://api.twitter.com/1.1/friends/list.json'
conn = sqlite3.connect('arana.sqlite')
cur = conn.cursor()
cur.execute('''
CREATE TABLE IF NOT EXISTS Twitter
(nombre TEXT, recuperado INTEGER, amigos INTEGER)''')
# Ignorar errores de certificado SSL
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
while True:
cuenta = input('Ingresa una cuenta de Twitter, o salir: ')
if (cuenta == 'salir'): break
if (len(cuenta) < 1):
cur.execute('''SELECT nombre FROM Twitter
WHERE recuperado = 0 LIMIT 1''')
try:
cuenta = cur.fetchone()[0]
except:
print('No se han encontrado cuentas de Twitter por recuperar')
continue
url = twurl.aumentar(TWITTER_URL, {'screen_name': cuenta, 'count': '5'})
print('Recuperando', url)
conexion = urlopen(url, context=ctx)
datos = conexion.read().decode()
cabeceras = dict(conexion.getheaders())
print('Restante', cabeceras['x-rate-limit-remaining'])
js = json.loads(datos)
# Depuración
# print json.dumps(js, indent=4)
cur.execute('''UPDATE Twitter
SET recuperado=1 WHERE nombre = ?''', (cuenta, ))
contnuevas = 0
contantiguas = 0
for u in js['users']:
amigo = u['screen_name']
print(amigo)
cur.execute('SELECT amigos FROM Twitter WHERE nombre = ? LIMIT 1',
(amigo, ))
try:
contador = cur.fetchone()[0]
cur.execute('UPDATE Twitter SET amigos = ? WHERE nombre = ?',
(contador+1, amigo))
contantiguas = contantiguas + 1
except:
cur.execute('''INSERT INTO Twitter (nombre, recuperado, amigos)
VALUES (?, 0, 1)''', (amigo, ))
contnuevas = contnuevas + 1
print('Cuentas nuevas=', contnuevas, ' ya visitadas=', contantiguas)
conn.commit()
cur.close()
# Código: https://es.py4e.com/code3/twspider.py
Veritabanımız dosyada saklanır arana.sqlite
ve adında bir tabloya sahiptir Twitter
. Tablodaki her satır Twitter
, hesabın adı için bir sütun, bir diğeri o hesabın arkadaşlarını alıp almadığımızı gösteren bir sütun ve o hesabın diğerlerinin arkadaş listesine eklenmiş olarak kaç kez görüldüğünü kaydetmek için bir sütun içerir.
Programın ana döngüsünde, programı sonlandırmak için kullanıcıdan bir Twitter hesap adı veya “çıkış” yapmasını istiyoruz. Kullanıcı bir Twitter hesabına girerse, o kullanıcının arkadaş listesini ve durumlarını alır ve orada değillerse her bir arkadaşı veritabanına ekleriz. Arkadaş zaten listedeyse, amigos
veritabanının ilgili satırındaki alanı 1 artırırız.
Kullanıcı enter’a basarsa, veritabanında henüz alınmamış bir sonraki Twitter hesabını arar, o hesabın arkadaşlarını ve durumlarını alır ve ardından onları veritabanına ekler veya günceller ve sayaçlarını artırırız amigos
.
Arkadaş listesini ve durumlarını aldığımızda user
, döndürülen JSON’un öğeleri arasında hareket eder ve screen_name
her kullanıcının (görünen adını) alırız. SELECT
Daha sonra , veritabanında depolanan belirli bir isme sahip olup olmadığımızı kontrol etmek için ifadeyi kullanırız ve eğer öyleyse, arkadaş sayısını alırız ( amigos
).
contnuevas = 0
contantiguas = 0
for u in js['users']:
amigo = u['screen_name']
print(amigo)
cur.execute('SELECT amigos FROM Twitter WHERE nombre = ? LIMIT 1',
(amigo, ))
try:
contador = cur.fetchone()[0]
cur.execute('UPDATE Twitter SET amigos = ? WHERE nombre = ?',
(contador+1, amigo))
contantiguas = contantiguas + 1
except:
cur.execute('''INSERT INTO Twitter (nombre, recuperado, amigos)
VALUES (?, 0, 1)''', (amigo, ))
contnuevas = contnuevas + 1
print('Cuentas nuevas=', contnuevas, ' ya visitadas=', contantiguas)
conn.commit()
İmleç deyimi çalıştırdığında SELECT
, satırları almamız gerekir. Bunu bir deyimle yapabiliriz for
, ancak yalnızca tek bir satır ( ) aldığımız için, yöntemi , işlemin sonuçlandığı ilk (ve tek) satırı getirmek için LIMIT 1
de kullanabiliriz . Satırı bir demet olarak döndürdüğü için (yalnızca bir alan içerse bile), demetin ilk değerini [0] ile alırız, böylece mevcut arkadaş sayısının değerini değişkenin içinde saklarız.fetchone()
SELECT
fetchone()
contador
Bu işlem başarılı olursa , o satırın arkadaşının hesabıyla eşleşen sütununa 1 eklemek için UPDATE
bir yan tümceli SQL deyimini kullanırız. SQL’de iki yer tutucu (yani soru işaretleri) olduğunu ve ikinci parametresinin SQL deyimi içindeki bu soru işaretlerinin yerine geçecek değerleri içeren iki elemanlı bir demet olduğunu unutmayın.WHERE
amigos
execute()
Bloktaki kod try
başarısız olursa, bunun nedeni büyük olasılıkla hiçbir kaydın WHERE nombre = ?
SELECT deyimi yan tümcesinde belirtilenle eşleşmemesidir. Bu yüzden blokta , arkadaşın görünen adını ( ) tabloya eklemek için except
SQL deyimini kullanırız ve onu henüz almadığımızı gösterir ve arkadaş sayısını sıfıra ayarlarız.INSERT
screen_name
Program ilk çalıştığında ve bir Twitter hesabına girdiğimizde şuna benzer bir şey gösterecek:
Ingresa una cuenta de Twitter, o salir: drchuck
Recuperando http://api.twitter.com/1.1/friends ...
Cuentas nuevas= 20 ya visitadas= 0
Ingresa una cuenta de Twitter, o salir: salir
Programı ilk defa çalıştırdığımız için veritabanı boş olduğu için dosyayı oluşturup veritabanı arana.sqlite
adında bir tablo ekliyoruz Twitter
. Sonra bazı arkadaşlarımızı alırız ve boş olduğu için onları veritabanına ekleriz.
Bu noktada, dosyanın içinde ne olduğuna bakmak için basit bir döküm programı yazmak uygun olabilir spider.sqlite
:
import sqlite3
conn = sqlite3.connect('arana.sqlite')
cur = conn.cursor()
cur.execute('SELECT * FROM Twitter')
contador = 0
for fila in cur:
print(fila)
contador = contador + 1
print(contador, 'filas.')
cur.close()
# Código: https://es.py4e.com/code3/twdump.py
Bu program basitçe veritabanını açar ve tablonun tüm satırlarındaki tüm sütunları seçer Twitter
, ardından satırlar arasında hareket eder ve içeriklerini ekrana yazdırır.
Bu programı Twitter örümcekimizin ilk çalıştırılmasından sonra çalıştırırsak, göstereceği çıktı şuna benzer olacaktır:
('opencontent', 0, 1)
('lhawthorn', 0, 1)
('steve_coppin', 0, 1)
('davidkocher', 0, 1)
('hrheingold', 0, 1)
...
20 filas.
Her isim için bir satır görüyoruz, bu isimlerden herhangi biri için henüz veri almadık ve veritabanındaki herkesin bir arkadaşı var.
Şu anda veritabanı, ilk Twitter hesabımızın ( drchuck ) arkadaşlarının kurtarılmasını gösteriyor. Programı tekrar çalıştırabilir ve bir hesap adı yazmak yerine sadece enter tuşuna basarak aşağıdaki “ham” hesabın arkadaşlarını almasını isteyebiliriz:
Ingresa una cuenta de Twitter, o salir:
Recuperando http://api.twitter.com/1.1/friends ...
Cuentas nuevas= 18 ya visitadas= 2
Ingresa una cuenta de Twitter, o salir:
Recuperando http://api.twitter.com/1.1/friends ...
Cuentas nuevas= 17 ya visitadas= 3
Ingresa una cuenta de Twitter, o salir: salir
Enter tuşuna bastığımız için (başka bir Twitter hesabı belirtmedik), aşağıdaki kod çalıştırıldı:
if ( len(cuenta) < 1 ) :
cur.execute('SELECT nombre FROM Twitter WHERE recuperado = 0 LIMIT 1')
try:
cuenta = cur.fetchone()[0]
except:
print('No se han encontrado cuentas de Twitter por recuperar')
continue
SQL deyimini , “bu kullanıcıyı zaten aldık” değeri sıfıra ayarlanmış SELECT
ilk kullanıcının ( ) adını almak için kullanırız. LIMIT 1
Ayrıca , alınan verilerden fetchone()[0]
“görünen adı” ( ) çıkarmak veya bir hata mesajı görüntüleyip başa dönmek için bir try/except bloğundaki kalıbı kullanırız.screen_name
Henüz işlenmemiş bir hesabın adını başarıyla aldıysak, verilerinizi aşağıdaki şekilde alırız:
url=twurl.augment(TWITTER_URL,{'screen_name': cuenta,'count': '20'})
print('Recuperando', url)
conexion = urllib.urlopen(url)
datos = conexion.read()
js = json.loads(datos)
cur.execute('UPDATE Twitter SET recuperado=1 WHERE nombre = ?',(cuenta, ))
Veriler başarıyla alındığında UPDATE
, sütunu 1’e ayarlamak için ifadeyi kullanırız recuperado
, bu da o hesaptan arkadaş çıkarmanın bittiğini gösterir. Bu, aynı verileri tekrar tekrar almamızı engeller ve Twitter arkadaş ağı üzerinden ilerlememizi sağlar.
Arkadaşlar programını çalıştırır ve bir sonraki ziyaret edilmemiş arkadaşın arkadaşlarını almak için iki kez enter tuşuna basarsak ve ardından dump programını tekrar çalıştırırsak, bize aşağıdaki çıktıyı verecektir:
('opencontent', 1, 1)
('lhawthorn', 1, 1)
('steve_coppin', 0, 1)
('davidkocher', 0, 1)
('hrheingold', 0, 1)
...
('cnxorg', 0, 2)
('knoop', 0, 1)
('kthanos', 0, 2)
('LectureTools', 0, 1)
...
55 filas.
Yaptığımız ziyaretlerin lhawthorn
doğru bir şekilde kaydedildiğini görebiliriz opencontent
. Ayrıca hesapları cnxorg
ve kthanos
zaten iki takipçisi var. drchuck
Üç kişinin ( , opencontent
, ve ) arkadaşlarını aldığımız için lhawthorn
, tablo alınacak 55 arkadaş satırı içerir.
Programı her çalıştırdığımızda ve enter tuşuna bastığımızda, bir sonraki ziyaret edilmemiş hesabı seçecek (yani şimdi bir sonraki hesap olacak steve_coppin
), arkadaşlarını alacak, onları alındı olarak işaretleyecek ve her bir arkadaşı için steve_coppin
, ya sonuna ekleyecek. veya veritabanında zaten varsa arkadaş sayacınızı güncelleyecektir.
Tüm program verileri bir veritabanında diskte saklandığından, tarama etkinliği herhangi bir veri kaybı olmadan istendiği kadar askıya alınabilir ve yeniden başlatılabilir.
İlişkisel veritabanlarının gerçek gücü, birden çok tablo oluşturduğunuzda ve bunlar arasında bağlantılar oluşturduğunuzda gelir. Uygulamanızın verilerini birden çok tabloya nasıl ayıracağınıza karar vermeye ve bu tablolar arasındaki ilişkileri kurmaya veri modelleme denir . Tabloları ve bunların ilişkilerini gösteren tasarım belgesine veri modeli denir .
Veri modelleme nispeten karmaşık bir beceridir ve bu bölümde sadece konuyla ilgili en temel kavramları tanıtacağız. Veri modelleme hakkında daha fazla ayrıntı almak için aşağıdakilerle başlayabilirsiniz:
Twitter takip uygulamamız için, bir kişinin arkadaşlarını basitçe saymak yerine, bir kişinin hesabını takip eden kişilerin bir listesini bulabilmemiz için aralarındaki tüm ilişkilerin bir listesini tutmak istediğimizi varsayalım.
Herkesin potansiyel olarak çok sayıda hesabı olabileceğinden, tablomuza tek bir sütun ekleyemeyiz Twitter
. Böylece, arkadaş çiftlerinin kaydını tutan yeni bir tablo oluşturuyoruz. İşte böyle bir tablo yapmanın basit bir yolu:
CREATE TABLE Colegas (desde_amigo TEXT, hacia_amigo TEXT)
Takip ettiğiniz bir kişiyi her bulduğumuzda drchuck
, şöyle bir satır ekleyeceğiz:
INSERT INTO Colegas (desde_amigo,hacia_amigo) VALUES ('drchuck', 'lhawthorn')
Twitter’ın bize gönderdiği 20 arkadaşı drchuck
işlerken, ilk parametre olarak “drchuck” olan 20 kayıt ekleyeceğiz, böylece dizgiyi veritabanında birkaç kez tekrarlayacağız.
Veri dizilerinin bu şekilde kopyalanması, veritabanı normalleştirmesi için en iyi uygulamalardan birini ihlal eder ; bu, temelde aynı dizeyi hiçbir zaman veritabanında bir kereden fazla saklamamanız gerektiğidir. Veriye birden çok kez ihtiyaç duyulursa, bunun için bir sayısal anahtar ve bu anahtar aracılığıyla başvurulan gerçek veriler oluşturulmalıdır.
Pratik açıdan, bir dize, hem diskte hem de bilgisayarın belleğinde bir tamsayıdan çok daha fazla yer kaplar ve ayrıca karşılaştırma ve sıralama için daha fazla işlemci zamanı alır. Yalnızca birkaç yüz girişiniz varsa, alan ve işlemci süresi çok önemli değildir. Ancak veritabanında bir milyon kişi varsa ve muhtemelen arkadaşlarınızdan 100 milyon bağlantı varsa, verileri olabildiğince çabuk gözden geçirebilmek önemlidir.
Twitter hesaplarımızı bir önceki örnekte kullandığımız Personas
tablo yerine isimli bir tabloda saklayacağız. Twitter
Tabloda Personas
, her Twitter kullanıcısının satırıyla ilişkili sayısal anahtarı depolamak için ek bir sütun bulunur. SQLite, özel bir sütun veri türü ( ) kullanarak tabloya eklediğiniz herhangi bir satır için anahtar değerini otomatik olarak eklemenize izin veren bir özelliğe sahiptir INTEGER PRIMARY KEY
.
Tabloyu Personas
bu ek sütunla id
aşağıda gösterildiği gibi oluşturabiliriz:
CREATE TABLE Personas
(id INTEGER PRIMARY KEY, nombre TEXT UNIQUE, recuperado INTEGER)
Artık tablonun her sütununda bir arkadaş sayısını tutmamız gerekmediğine dikkat edin Personas
. INTEGER PRIMARY KEY
Sütun türü olarak seçtiğimizde id
SQLite’ın bu sütunu kontrol etmesini ve eklediğimiz her satıra otomatik olarak benzersiz bir sayısal anahtar atamasını istediğimizi belirtiyoruz. UNIQUE
SQLite’ın aynı değere sahip iki satır eklemesine izin vermeyeceğimizi belirtmek için anahtar sözcüğünü de ekleriz nombre
.
Colegas
Şimdi, tabloyu daha önce yaptığımız gibi oluşturmak yerine, tamsayı ve Seguimientos
türünde iki sütunla adlandırılan bir tablo oluşturacağız ve tablo üzerinde ve kombinasyonunun benzersiz olması gereken (yani, satır eklenemeyecekleri) bir kısıtlama oluşturacağız. bu yinelenen değerlere sahip tabloda) veritabanımızda.desde_id
hacia_id
desde_id
hacia_id
CREATE TABLE Seguimientos
(desde_id INTEGER, hacia_id INTEGER, UNIQUE(desde_id, hacia_id) )
Yan tümceyi UNIQUE
tablolarımıza eklediğimizde, kayıt eklemeye çalışırken veritabanını uymaya zorlayacağımız bir dizi kural iletiyoruz. Bu kuralları, birazdan göreceğimiz gibi, programımıza uygun oldukları için oluşturuyoruz. Her iki kural da hata yapılmasını engeller ve bazı kodlarımızı yazmayı kolaylaştırır.
Özünde, bu tabloyu oluşturarak Seguimientos
, bir kişinin diğerini “takip ettiği” ve (a) her iki kişinin de bağlantılı olduğunu ve (b) ilişkinin yönünü gösteren bir çift sayı ile temsil edildiği bir “ilişki” modelliyoruz. ilişki.
Şimdi, yukarıda açıklandığı gibi, birincil anahtarlar ve referans anahtarları olmak üzere iki tablo kullanarak Twitter örümcek programını yeniden yapacağız. İşte programın yeni sürümünün kodu:
import urllib.request, urllib.parse, urllib.error
import twurl
import json
import sqlite3
import ssl
TWITTER_URL = 'https://api.twitter.com/1.1/friends/list.json'
conn = sqlite3.connect('amigos.sqlite')
cur = conn.cursor()
cur.execute('''CREATE TABLE IF NOT EXISTS Personas
(id INTEGER PRIMARY KEY, nombre TEXT UNIQUE, recuperado INTEGER)''')
cur.execute('''CREATE TABLE IF NOT EXISTS Seguimientos
(desde_id INTEGER, hacia_id INTEGER, UNIQUE(desde_id, hacia_id))''')
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
while True:
cuenta = input('Ingresa una cuenta de Twitter, o salir: ')
if (cuenta == 'salir'): break
if (len(cuenta) < 1):
cur.execute('''SELECT id, nombre FROM Personas
WHERE recuperado=0 LIMIT 1''')
try:
(id, cuenta) = cur.fetchone()
except:
print('No se han encontrado cuentas de Twitter sin recuperar')
continue
else:
cur.execute('SELECT id FROM Personas WHERE nombre = ? LIMIT 1',
(cuenta, ))
try:
id = cur.fetchone()[0]
except:
cur.execute('''INSERT OR IGNORE INTO Personas
(nombre, recuperado) VALUES (?, 0)''', (cuenta, ))
conn.commit()
if cur.rowcount != 1:
print('Error insertando cuenta:', cuenta)
continue
id = cur.lastrowid
url = twurl.aumentar(TWITTER_URL,
{'screen_name': cuenta, 'count': '100'})
print('Recuperando cuenta', cuenta)
try:
conexion = urllib.request.urlopen(url, context=ctx)
except Exception as err:
print('Fallo al recuperar', err)
break
datos = conexion.read().decode()
cabeceras = dict(conexion.getheaders())
print('Restantes', cabeceras['x-rate-limit-remaining'])
try:
js = json.loads(datos)
except:
print('Fallo al analizar json')
print(datos)
break
# Depuración
# print(json.dumps(js, indent=4))
if 'users' not in js:
print('JSON incorrecto recibido')
print(json.dumps(js, indent=4))
continue
cur.execute('UPDATE Personas SET recuperado=1 WHERE nombre = ?', (cuenta, ))
contnuevas = 0
contantiguas = 0
for u in js['users']:
amigo = u['screen_name']
print(amigo)
cur.execute('SELECT id FROM Personas WHERE nombre = ? LIMIT 1',
(amigo, ))
try:
amigo_id = cur.fetchone()[0]
contantiguas = contantiguas + 1
except:
cur.execute('''INSERT OR IGNORE INTO Personas
(nombre, recuperado) VALUES (?, 0)''', (amigo, ))
conn.commit()
if cur.rowcount != 1:
print('Error inserting account:', amigo)
continue
amigo_id = cur.lastrowid
contnuevas = contnuevas + 1
cur.execute('''INSERT OR IGNORE INTO Seguimientos
(desde_id, hacia_id) VALUES (?, ?)''', (id, amigo_id))
print('Cuentas nuevas=', contnuevas, ' ya visitadas=', contantiguas)
print('Restantes', cabeceras['x-rate-limit-remaining'])
conn.commit()
cur.close()
# Código: https://es.py4e.com/code3/twfriends.py
Bu program biraz karmaşıklaşmaya başlıyor, ancak tabloları bağlamak için tamsayı tuşlarını kullanırken kullanmamız gereken tasarım modellerini gösteriyor. Bu temel kalıplar şunlardır:
id
o kişinin masada olup olmamasına bağlı olarak o kişinin değerine ihtiyacımız olduğunda Personas
, şunları yapmamız gerekir: (1) içindeki kişiyi aramak tablo Personas
ve id
o kişi için değerini alın veya (2) kişiyi tabloya ekleyin ve yeni eklenen satır için Personas
değerini alın .id
Tüm noktaları tek tek açıklayacağız.
Tablo yapısını tasarlarken, veritabanı sistemine bazı kurallar uygulamak istediğimizi söyleyebiliriz. Bu kurallar, hatalardan kaçınmamıza ve verileri tablolara doğru bir şekilde girmemize yardımcı olacaktır. Tablolarımızı oluşturduğumuzda:
cur.execute('''CREATE TABLE IF NOT EXISTS Personas
(id INTEGER PRIMARY KEY, nombre TEXT UNIQUE, recuperado INTEGER)''')
cur.execute('''CREATE TABLE IF NOT EXISTS Seguimientos
(desde_id INTEGER, hacia_id INTEGER, UNIQUE(desde_id, hacia_id))''')
nombre
Tablo sütununun (benzersiz) Personas
olması gerektiğini belirtiyoruz . UNIQUE
Ayrıca tablonun her satırındaki iki sayının kombinasyonunun Seguimientos
da benzersiz olması gerektiğini belirtiyoruz. Bu kısıtlamalar, aynı kişiler arasında aynı ilişkiyi birden çok kez eklemek gibi hatalar yapmamızı engeller.
Daha sonra aşağıdaki kodda bu kısıtlamalardan yararlanabiliriz:
cur.execute('''INSERT OR IGNORE INTO Personas (nombre, recuperado)
VALUES ( ?, 0)''', ( amigo, ) )
Burada , bu hususun “benzersiz olmalıdır ” kuralının ihlaline neden OR IGNORE
olması durumunda, veritabanı sisteminin . Bu şekilde, yanlışlıkla yanlış bir şey yapmadığımızdan emin olmak için veritabanı kısıtlamalarını bir güvenlik ağı olarak kullanıyoruz.INSERT
INSERT
nombre
INSERT
Benzer şekilde, aşağıdaki kod, aynı ilişkiyi iki kez eklemememizi sağlar Seguimiento
.
cur.execute('''INSERT OR IGNORE INTO Seguimientos
(desde_id, hacia_id) VALUES (?, ?)''', (id, amigo_id) )
INSERT
Yine, veritabanına her satır için belirttiğimiz benzersizlik kısıtlamasını ihlal eden herhangi bir girişimi yoksaymasını söylüyoruz Seguimientos
.
Kullanıcıdan bir Twitter hesabı istediğimizde, hesap zaten varsa, onun değerini öğrenmeliyiz id
. Hesap zaten tabloda yoksa Personas
, kaydı eklemeli ve id
yeni eklenen satırın değerini almalıyız.
Bu çok yaygın bir düzendir ve yukarıdaki programda iki kez kullanılır. Bu kod, bir arkadaşın Twitter’dan alınan bir JSON düğümünden id
çıkarıldıktan sonra hesabına nasıl bakılacağını gösterir .screen_name
usuario
Zamanla, hesabın zaten veritabanında olma olasılığı giderek artacağından, önce Personas
bir ifade kullanarak kaydın içinde olup olmadığını kontrol edeceğiz SELECT
.
Bölüm içinde her şey yolunda giderse try
kullanarak kaydı alacağız fetchone()
ve sonra geri döndürülen demetin ilk (ve tek) öğesini çıkaracağız, ki bu da içinde depolayacağız amigo_id
.
Başarısız SELECT
olursa, kod fetchone()[0]
da başarısız olur ve kontrol bölüme aktarılır except
.
amigo = u['screen_name']
cur.execute('SELECT id FROM Personas WHERE nombre = ? LIMIT 1',
(amigo, ) )
try:
amigo_id = cur.fetchone()[0]
contantiguas = contantiguas + 1
except:
cur.execute('''INSERT OR IGNORE INTO Personas (nombre, recuperado)
VALUES ( ?, 0)''', ( amigo, ) )
conn.commit()
if cur.rowcount != 1 :
print('Error al insertar cuenta:',amigo)
continue
amigo_id = cur.lastrowid
contnuevas = contnuevas + 1
Sonunda del koduna ulaşırsak except
, bu sadece satırın tabloda bulunmadığı anlamına gelir, bu yüzden onu eklememiz gerekir. INSERT OR IGNORE
Olası hatalardan kaçınmak için kullanırız ve ardından commit()
veritabanını gerçek güncellemeye zorlamak için çağırırız. cur.rowcount
Yazma işlemi tamamlandıktan sonra, kaç satırın etkilendiğini görmek için değerini kontrol edebiliriz . Tek satır eklemeye çalıştığımız için etkilenen satır sayısı 1’den farklı olsaydı hata oluşmuş olurdu.
Başarılı olursa, yeni oluşturduğumuz satırımızdaki sütuna veritabanının atadığı değeri bulmak için INSERT
kullanabiliriz .cur.lastrowid
id
JSON’dan çıkardığımız hem Twitter kullanıcısı hem de arkadaş için anahtar değeri öğrendikten sonra Seguimientos
, aşağıdaki kodla her iki sayıyı da tabloya eklemek kolaydır:
cur.execute('''INSERT OR IGNORE INTO Seguimientos
(desde_id, hacia_id) VALUES (?, ?)''', (id, amigo_id) )
Benzersiz bir kısıtlamaya sahip bir tablo oluşturarak, veritabanının bir ilişkinin “yinelenen eklemesinden” kaçınmaya özen göstermesine izin verdiğimizi unutmayın, bu nedenle ifademizin ilerleyen kısımlarında INSERT
sadece o ignoramos
.
İşte bu programı çalıştırmanın bir örneği:
Ingresa una cuenta de Twitter, o salir:
No se han encontrado cuentas de Twitter sin recuperar
Ingresa una cuenta de Twitter, o salir: drchuck
Recuperando http://api.twitter.com/1.1/friends ...
Cuentas nuevas= 20 ya visitadas= 0
Ingresa una cuenta de Twitter, o salir:
Recuperando http://api.twitter.com/1.1/friends ...
Cuentas nuevas= 17 ya visitadas= 3
Ingresa una cuenta de Twitter, o salir:
Recuperando http://api.twitter.com/1.1/friends ...
Cuentas nuevas= 17 ya visitadas= 3
Ingresa una cuenta de Twitter, o salir: salir
Hesabı ile başlıyoruz drchuck
ve ardından programın otomatik olarak sonraki iki hesabı alıp veri tabanımıza eklemesine izin veriyoruz.
Aşağıdakiler tabloların ilk satırlarıdır Personas
ve Seguimientos
önceki yürütmeyi bitirdikten sonra:
Personas:
(1, 'drchuck', 1)
(2, 'opencontent', 1)
(3, 'lhawthorn', 1)
(4, 'steve_coppin', 0)
(5, 'davidkocher', 0)
55 filas.
Seguimientos:
(1, 2)
(1, 3)
(1, 4)
(1, 5)
(1, 6)
60 filas.
Tablonun alanlarını id
, nombre
, ve ayrıca tablodaki ilişkinin her iki ucundaki sayıları görebilirsiniz . Tabloda ilk üç kişinin zaten ziyaret edildiğini ve verilerinin alındığını görüyoruz. Tablodaki veriler (kullanıcı 1) ilk beş satırda gösterilen tüm kişilerle arkadaş olduğunu gösterir . Bu mantıklı, çünkü aldığımız ve sakladığımız ilk veriler Twitter’ın arkadaşlarıydı . Tablonun daha fazla satırını yazdıracak olsaydınız , 2. ve 3. kullanıcıların arkadaşlarını da görürsünüz.visitado
Personas
Seguimientos
Personas
Seguidores
drchuck
drchuck
Seguimientos
Artık bir veri modeli oluşturmaya başladığımıza, verilerimizi birden çok bağlantılı tabloya yerleştirdiğimize ve bu tablolardan anahtarları kullanarak satırları bağladığımıza göre, bu anahtarlar hakkında bazı terminolojiye dikkat etmemiz gerekiyor. Genel olarak, bir veritabanı modelinde kullanılabilecek üç tür anahtar vardır.
nombre
mantıksal bir anahtardır. Bu kullanıcı için ekran adıdır ve gerçekten biz sahadan kullanmak nombre
bir kullanıcı için satır bulmak için programda birden çok kez. Bunu genellikle bir kısıtlama eklemek mantıklı olduğunu göreceksiniz UNIQUE (única)
mantıksal anahtar. Mantıksal anahtarlar, dış dünyadan bir satırı aramak için kullandığımız şey olduğundan, tabloda aynı değere sahip birden çok satırın bulunmasına izin vermek pek mantıklı olmaz.id
, birincil anahtara bir örnektir.desde_id
.Her zaman birincil anahtar alanına bir ad vermek ve yabancı anahtar olan herhangi bir alan adına id
soneki eklemek için adlandırma kuralını kullanıyoruz._id
SELECT
Artık veritabanı normalleştirme kurallarına uyduğumuza ve verileri birincil ve yabancı anahtarlar kullanarak birbirine bağlayarak iki tabloya ayırdığımıza göre, tablolara yayılmış verileri yeniden birleştiren bir sistem oluşturabilmemiz gerekecek .
SQL, JOIN
bu tabloları yeniden bağlamak için yan tümceyi kullanır. Yan tümce JOIN
, farklı tablolar arasındaki satırları yeniden bağlamak için kullanılan alanları belirtir.
İşte SELECT
bir yan tümce içeren bir örnek JOIN
:
SELECT * FROM Seguimientos JOIN Personas
ON Seguimientos.desde_id = Personas.id WHERE Personas.id = 1
Yan tümce JOIN
, seçtiğimiz alanların tabloları karıştırdığını Seguimientos
ve Personas
. Yan tümce ON
, iki tablonun nasıl birleştirileceğini belirtir: Her satırını alın ve içindeki alanın tablodaki değerle eşleştiği Seguimientos
bir satır ekleyin .Personas
desde_id
Seguimientos
id
Personas
JOIN sonucu alanlarını içerecektir ekstra uzun “meta sıranın” nin oluşturulmasında oluşur Personas
ve sıranın alanlarını Seguimientos
o araya koşulu. Arasında birden fazla eşleşme olduğunda id
gelen alan Personas
ve desde_id
gelen alanda Seguimientos
, bir meta satır oluşturacaktır artır her gerektiğinde veri çoğaltma, satır uygun çift.
Aşağıdaki kod, yukarıdaki Twitter multi-table spider programı birkaç kez çalıştırıldıktan sonra veritabanında alacağımız verileri göstermektedir.
import sqlite3
conn = sqlite3.connect('amigos.sqlite')
cur = conn.cursor()
cur.execute('SELECT * FROM Personas')
contador = 0
print('Personas:')
for fila in cur:
if contador < 5: print(fila)
contador = contador + 1
print(contador, 'filas.')
cur.execute('SELECT * FROM Seguimientos')
contador = 0
print('Seguimientos:')
for fila in cur:
if contador < 5: print(fila)
contador = contador + 1
print(contador, 'filas.')
cur.execute('''SELECT * FROM Seguimientos JOIN Personas
ON Seguimientos.hacia_id = Personas.id
WHERE Seguimientos.desde_id = 2''')
contador = 0
print('Conexiones para id=2:')
for fila in cur:
if contador < 5: print(fila)
contador = contador + 1
print(contador, 'filas.')
cur.close()
# Código: https://es.py4e.com/code3/twjoin.py
Bu programda, önce tabloların içeriklerini döküyoruz Personas
ve Seguimientos
ardından birleştirilmiş tablolardan bir veri alt kümesini gösteriyoruz.
İşte Programın çıktısı:
python twjoin.py
Personas:
(1, 'drchuck', 1)
(2, 'opencontent', 1)
(3, 'lhawthorn', 1)
(4, 'steve_coppin', 0)
(5, 'davidkocher', 0)
55 filas.
Seguimientos:
(1, 2)
(1, 3)
(1, 4)
(1, 5)
(1, 6)
60 filas.
Conexiones para id=2:
(2, 1, 1, 'drchuck', 1)
(2, 28, 28, 'cnxorg', 0)
(2, 30, 30, 'kthanos', 0)
(2, 102, 102, 'SomethingGirl', 0)
(2, 103, 103, 'ja_Pac', 0)
20 filas.
Tabloların sütunlarını Personas
ve ardından with yan tümcesinin Seguimientos
sonucu olan son satır kümesini görebilirsiniz .SELECT
JOIN
Son seçme, biz (etmektedir “opencontent” dostlarıdır hesaplarını bulun Personas.id=2
).
Son seçme ait “meta sıralar” her birinde, ilk iki sütun tabloya ait Seguimientos
beşe kadar olan sütunlar üç iken masaya aittir, Personas
. Ayrıca ne kadar İkinci sütun (görebilirsiniz Seguimientos.hacia_id
üçüncüsü) çakışmaktadır ( Personas.id
birleştirilmiş “meta sıralar” Her).
Bu bölümde, Python’da bir veritabanı kullanmak için neyin gerekli olduğuna dair bir vizyon vermek için birçok tema denedik. Python sözlükleri veya düz dosyaları kullanarak verileri saklamak için bir veritabanı kullanmak için kodu yazmak daha zordur, bu nedenle başvurunuzun gerçek yeteneklere ihtiyaç duymadıkça, bir veritabanını kullanmak için çok az bir neden var. Bir veritabanının oldukça faydalı olabileceği durumlar şunlardır: (1) Başvurunuzun, (2) bir sözlüğe uymayan ve genellikle ihtiyaç duyan çok fazla veriye sahip olduğunuzda bilgileri bulmak veya (3) uzun süre çalışacak bir süreciniz olduğunda,
Tek bir tabloya sahip bir veritabanı, birçok uygulamanın ihtiyaçlarını karşılamak için yeterli olabilir, ancak çoğu problemin farklı tabloların satırları arasında birden fazla tablo ve link / ilişki gerektirecektir. Tablolar arasında bağlantılar oluşturmaya başladığınızda, yeteneklerinden en iyi şekilde yararlanmak için düşünceli bir tasarım yapmak ve veritabanı normalleştirme kurallarına uymak önemlidir. Bir veri tabanı kullanılması için ana motivasyon olduğu için, tedavi edilecek olan büyük miktarda veriye sahip olma eğiliminde olduğundan, verileri verimli bir şekilde modellemek önemlidir, böylece programınız mümkün olduğu kadar çabuk çalışacaktır.
Yaygın bir yaklaşım SQLite veritabanına bağlandığı, program ilk çalıştırın ve ardından tarayıcı SQLite veritabanlarını kullanarak sonuçları gözden geçirecektir Python dilinde bir program (SQLite için Veritabanı Tarayıcısı) geliştirirken. tarayıcı dikkatle programın düzgün çalışıp çalışmadığını kontrol etmek için, verileri gözden sağlar.
SQLite aynı anda aynı veri değiştirmesini iki program önlenmesi sorumlu olduğundan, dikkatli olmalısınız. Örneğin, tarayıcıda bir veritabanı açın ve veritabanına bir değişiklik yapmak, ancak henüz tarayıcınızın “save” butonuna, tarayıcı olacak “kilit” veritabanı dosyası basılı değil ve herhangi başka bir program bu dosyayı erişir önlemek eğer. Özellikle, bu durumda Python program kilitlenir, çünkü dosyaya erişmek mümkün olmayacaktır.
Çözelti ya marka olmaktır Yani emin veritabanı tarayıcı penceresini kapatın veya kullanmak üzere Dosya menüsünü piton kodu nedeniyle başarısız olduğunu sorun haline çalışıyor önlemek için, Python erişmek için denemeden önce tarayıcıda açık veritabanını kapatmak için veritabanı kilitli.
bağlanmakBir demet içindeki değerlerden biri. Daha yaygın “sütununda” veya “alan” olarak adlandırılan.imleçBir imleç bir veritabanı üzerinde SQL komutlarını çalıştırmak ve ondan veri almak için izin verir. Bir imleç ağ bağlantılarında bir soket veya bir dosya işleyicisi benzer.yabancı anahtarbaşka bir tablodaki bir sıra birincil anahtar bir sayısal tuş olduğu işaret etmektedir. Yabancı anahtarlar farklı tablolarda saklanan satırlar arasındaki ilişkiler kurmak.mantıksal anahtarBelirli bir satır bulmak için kullanılan “dış dünya” için bir anahtar. Örneğin, kullanıcı hesaplarının bir tabloda, bir kişinin e-posta bu kullanıcı için mantıksal bir anahtar veri olarak kullanılmak için iyi bir aday olurdu.birincil anahtarFarklı bir tablodan o tablonun belirli bir satırına başvurmak için kullanılan, her satıra atanan sayısal bir anahtar. Genellikle veritabanı, satır ekleyerek birincil tuşları otomatik olarak atamak için yapılandırılmıştır.dizinEk veri yazılım aramaları çok hızlı yapmak için bir tabloya satır ve ekleri olarak veritabanını korur.veritabanı tarayıcısıbunun için kod yazmak zorunda kalmadan, bir veritabanına doğrudan bağlanır ve onu manipüle etmeye izin veren bir program.standardizasyonHiçbir yinelenen veri olmayacak şekilde modelleme bir veriyi tasarımı. Her bir veri elemanı veritabanının belirli bir yerde saklanır ve bir dış anahtar kullanarak diğer sitelerden başvurulmaktadır.ilişkiDemetler ve özelliklerini içeren bir veritabanı içinde bir alan. O, “tablosunun” olarak daha yaygın bilinir.kısıtlamaNe zaman bir tablodaki bir satırda bir alana bir kural uygular bir veritabanı istedi. Yaygın bir kısıtlama (yani bütün değerleri benzersiz olmalıdır) belirli alanındaki değerleri orada tekrar edilebilir olduğunu belirtmektir.çiftniteliklerin bir dizi bir veritabanında tek bir giriş. O, “sıranın” olarak daha yaygın bilinir.
Samsung çamaşır makinesindeki 4E hatasının anlamı ve nasıl d...
Instagram story arka plan rengini değiştirin Kaç kez instagr...
Veritabanları ve SQL Veritabanı , verileri depolamak iç...
İç mekan için dekoratif aynalar: yerleştirme ve seçim için i...
Bazıları kahramanca veya kötü niyetli, büyüleyici veya iğren...
Dış cephe boya renklerinin seçimi – çok zor Dış cephe ...
CEPHE KAPLAMA: MALZEMELER VE FİKİRLER İyi bir görüntü evleri...
Bir bahçeye sahip olmak, birçok kişinin lüks olarak görebile...
Hata kodları Bosch çamaşır makinesi Sembolleri ve anlamları ...
Balkondaki perdeler: her iç tasarımda güzel ve şık tasarım f...