Reklamı kapat
Reklamı kapat
Tor Wep
Tor Wep

Python veritabanı nedir?

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-

Python veritabanı nedir?

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 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.

Veritabanı Kavramları

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.

Veritabanında tablo oluşturma

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.

CancionesVeritabanı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 connectdosyada depolanan veritabanıyla bağlantı kurar . musica.sqliteDosya 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.

CancionesZaten varsa , ilk SQL komutu tabloyu bırakır . CancionesBu 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 TABLEtabloyu 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ı Cancionesbir metin sütunu titulove 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 VALUESiç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 INSERTtabloya iki satır ( ) ekliyoruz commit()ve veriyi veritabanı dosyasına yazılmaya zorlamak için kullanıyoruz.

Bir tablodaki sütunlar

SELECTArdı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 foriki satır bulur ve her satır, ilk değeri titulove 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 Unicodevarsayılan türdedir.

Programın sonunda, programı DELETEtekrar 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 DELETEyan 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 DELETEtekrar çağırıyoruz .commit()

Yapılandırılmış Sorgu Dilinin Özeti

Ş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 VALUESve 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 SELECTbir 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 WHEREtü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 WHEREiçin <><=>=!=ve ayrıca ANDand 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 WHEREbir yan tümce kullanmak gerekir. DELETEYan tümce WHERE, hangi satırların silineceğini belirler:

DELETE FROM Canciones WHERE titulo = 'My Way'

Aşağıda gösterildiği gibi UPDATESQL 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 UPDATEbir 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 SETiçin isteğe bağlı bir yan tümceyi belirtir. WHERETek 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.

Bir veritabanı kullanarak Twitter’da izleme

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.sqliteve 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, amigosveritabanı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_nameher kullanıcının (görünen adını) alırız. SELECTDaha 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 1de 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()SELECTfetchone()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 UPDATEbir 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.WHEREamigosexecute()

Bloktaki kod trybaş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 exceptSQL deyimini kullanırız ve onu henüz almadığımızı gösterir ve arkadaş sayısını sıfıra ayarlarız.INSERTscreen_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.sqliteadı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ış SELECTilk kullanıcının ( ) adını almak için kullanırız. LIMIT 1Ayrı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 lhawthorndoğru bir şekilde kaydedildiğini görebiliriz opencontent. Ayrıca hesapları cnxorgve kthanoszaten 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.

Temel veri modelleme

İ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şı drchuckiş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 Personastablo yerine isimli bir tabloda saklayacağız. TwitterTabloda 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 Personasbu ek sütunla idaş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 PersonasINTEGER PRIMARY KEYSütun türü olarak seçtiğimizde idSQLite’ın bu sütunu kontrol etmesini ve eklediğimiz her satıra otomatik olarak benzersiz bir sayısal anahtar atamasını istediğimizi belirtiyoruz. UNIQUESQLite’ı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 Seguimientostü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_idhacia_iddesde_idhacia_id

CREATE TABLE Seguimientos
    (desde_id INTEGER, hacia_id INTEGER, UNIQUE(desde_id, hacia_id) )

Yan tümceyi UNIQUEtabloları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.

Birden çok tablo ile programlama

Ş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:

  1. Birincil anahtarlar ve kısıtlamalar içeren tablolar oluşturun.
  2. Bir kişi için mantıksal bir anahtarımız olduğunda (yani bir hesap adı) ve ido 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 Personasve ido kişi için değerini alın veya (2) kişiyi tabloya ekleyin ve yeni eklenen satır için Personasdeğerini alın .id
  3. “Takip” ilişkisini gösteren satırı ekleyin.

Tüm noktaları tek tek açıklayacağız.

Veritabanı tablolarındaki kısıtlamalar

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))''')

nombreTablo sütununun (benzersiz) Personasolması gerektiğini belirtiyoruz . UNIQUEAyrıca tablonun her satırındaki iki sayının kombinasyonunun Seguimientosda 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 IGNOREolması 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.INSERTINSERTnombreINSERT

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) )

INSERTYine, 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.

Bir kaydı al ve/veya ekle

Kullanıcıdan bir Twitter hesabı istediğimizde, hesap zaten varsa, onun değerini öğrenmeliyiz id. Hesap zaten tabloda yoksa Personas, kaydı eklemeli ve idyeni 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_nameusuario

Zamanla, hesabın zaten veritabanında olma olasılığı giderek artacağından, önce Personasbir 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 SELECTolursa, 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 IGNOREOlası 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.rowcountYazma 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 INSERTkullanabiliriz .cur.lastrowidid

Arkadaşlar arasındaki ilişkileri saklayın

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 INSERTsadece 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 drchuckve 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 Personasve 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ı idnombre, 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.visitadoPersonasSeguimientosPersonasSeguidoresdrchuckdrchuckSeguimientos

Üç tür anahtar

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.

  • Bir mantıksal anahtar bir satır bulmak için “gerçek dünya” kullanılabilecek bir anahtardır. Veri modelleme örnekte, alan nombremantıksal bir anahtardır. Bu kullanıcı için ekran adıdır ve gerçekten biz sahadan kullanmak nombrebir 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.
  • Birincil anahtar normalde veritabanı tarafından otomatik olarak atanan bir sayıdır. Genellikle programın dışında bir anlamı yoktur ve yalnızca farklı tablolardan satırları birbirine bağlamak için kullanılır. Bir tabloda bir satır aramak istediğimizde, birincil anahtarı kullanarak arama yapmak genellikle onu bulmanın en hızlı yoludur. Birincil anahtarlar tamsayı olduğundan, çok az depolama alanına ihtiyaç duyarlar ve çok hızlı bir şekilde karşılaştırılabilir ve sıralanabilirler. Veri modelimizde alan id, birincil anahtara bir örnektir.
  • Yabancı anahtar, genellikle, farklı bir tablodaki ilişkili satırın birincil anahtarına işaret eden bir sayıdır. Veri modelimizde bir yabancı anahtar örneği, column desde_id.

Her zaman birincil anahtar alanına bir ad vermek ve yabancı anahtar olan herhangi bir alan adına idsoneki eklemek için adlandırma kuralını kullanıyoruz._id

Verileri almak için JOIN’i kullanma

SELECTArtı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, JOINbu 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 SELECTbir 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ı Seguimientosve 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 Seguimientosbir satır ekleyin .Personasdesde_idSeguimientosidPersonas

JOIN sonucu alanlarını içerecektir ekstra uzun “meta sıranın” nin oluşturulmasında oluşur Personasve sıranın alanlarını Seguimientoso araya koşulu. Arasında birden fazla eşleşme olduğunda idgelen alan Personasve desde_idgelen 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 Personasve Seguimientosardı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ı Personasve ardından with yan tümcesinin Seguimientossonucu olan son satır kümesini görebilirsiniz .SELECTJOIN

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 Seguimientosbeş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.idbirleştirilmiş “meta sıralar” Her).

Özet

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.

arındırma

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.

Sözlük

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.


  1. SQLite her sütunda depolanan verilerin türüne ilişkin bazı esneklik izin vermez, ancak bu bölümde böylece öğreniyoruz kavramlar eşit MySQL gibi diğer veritabanlarına uygulanabileceği, katı veri türlerini tutmak için gidiyoruz. ↩︎
  2. Genel olarak, bir cümle “Her şey yolunda giderse” ile başladığında, sözlü kodun deneyin / hariç kullanması gerekenler olmasıdır. ↩︎
İLGİNİZİ ÇEKEBİLECEK DİĞER HABERLER
instagram story arka plan instagram story arka plan

Instagram story arka plan rengini değiştirin Kaç kez instagram story arka plan girdiniz ve ana fotoğrafı kapsayan bir yarışma hikayesi ...

İç mekan için dekoratif aynalar İç mekan için dekoratif aynalar

İç mekan için dekoratif aynalar: yerleştirme ve seçim için ipuçları İç kısımdaki ayna sadece faydacı bir işlevi değil, aynı zamanda dek...

Dış cephe boya renkleri görseller Dış cephe boya renkleri görseller

Dış cephe boya renklerinin seçimi – çok zor Dış cephe boya renkleri görseller , en güzel dış cephe görselleri , dış cephe boya gö...

BU HABER HAKKINDA GÖRÜŞLERİNİZİ BELİRTMEK İSTER MİSİNİZ?(Yorum Yok)
SON EKLENEN HABERLER
Samsung çamaşır makinesi 4c hatası Samsung çamaşır makinesi ...

Samsung çamaşır makinesindeki 4E hatasının anlamı ve nasıl d...

instagram story arka plan instagram story arka plan

Instagram story arka plan rengini değiştirin Kaç kez instagr...

Python veritabanı nedir? Python veritabanı nedir?

Veritabanları ve SQL Veritabanı , verileri depolamak iç...

İç mekan için dekoratif aynalar İç mekan için dekoratif a...

İç mekan için dekoratif aynalar: yerleştirme ve seçim için i...

En İyi 20 Star Wars Karakteri En İyi 20 Star Wars Karak...

Bazıları kahramanca veya kötü niyetli, büyüleyici veya iğren...

Dış cephe boya renkleri görseller Dış cephe boya renkleri g...

Dış cephe boya renklerinin seçimi – çok zor Dış cephe ...

Hangi mantolama daha iyi yalıtım yapar Hangi mantolama daha iyi ...

CEPHE KAPLAMA: MALZEMELER VE FİKİRLER İyi bir görüntü evleri...

Çit budama makinesi tavsiye Çit budama makinesi tavsi...

Bir bahçeye sahip olmak, birçok kişinin lüks olarak görebile...

Bosch bulaşık makinesi sembolleri ve anlamları Bosch bulaşık makinesi se...

Hata kodları Bosch çamaşır makinesi Sembolleri ve anlamları ...

Modern balkon perdeleri yeni Modern balkon perdeleri y...

Balkondaki perdeler: her iç tasarımda güzel ve şık tasarım f...

Modern ev planları HABERLERİ
Modern ev planları