[Python pour tout le corps] 15 bases de données

Wnuow 2022-07-23 15:20:22 阅读数:270

pythonpourtoutlecorps

Relational Databases

Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici

SQL

Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici

SQL for Single Table–Création、Insérer、Supprimer、Mise à jour、Requête、Trier

Référence du document:
https://www.py4e.com/lectures3/Pythonlearn-15-Database-Handout.txt

-- Créer une table
CREATE TABLE "Users" ("name" TEXT, "email" TEXT)
/*Créer un nomUsersTableau, Indique la colonne contenant nameEtemail, Et le type de données correspondant est text TEXTTexte,INTEGEREntier,NUMERICDécimale,BLOB Objets binaires comme des images ou de la musique , REAL Nombre imprécis de points flottants de double précision */
-- Insérer
INSERT INTO Users (name, email) VALUES ('Chuck', '[email protected]');/* Un point - virgule doit être ajouté pour le fonctionnement continu */
INSERT INTO Users (name, email) VALUES ('Colleen', '[email protected]');
INSERT INTO Users (name, email) VALUES ('Ted', '[email protected]');
INSERT INTO Users (name, email) VALUES ('Sally', '[email protected]');
INSERT INTO Users (name, email) VALUES ('Ted', '[email protected]');
INSERT INTO Users (name, email) VALUES ('Kristen', '[email protected]')
-- Supprimer
DELETE FROM Users WHERE email='[email protected]'
-- Mise à jour
UPDATE Users SET name="Charles" WHERE email='[email protected]'
-- Demande tout
SELECT * FROM Users
-- Ligne partielle de requête
SELECT * FROM Users WHERE email='[email protected]'
-- Requête et tri ascendant 
SELECT * FROM Users ORDER BY email
-- Requête et tri par ordre décroissant 
SELECT * FROM Users ORDER BY name DESC

Insérer la description de l'image ici

import sqlite3
conn = sqlite3.connect('emaildb.sqlite') # access file, Sinon, créez le fichier 
cur = conn.cursor() #C'est un peu comme ça.open(),MaiscursorOui.openEt ensuite,SQL commandEnvoyé àcursor, Et puis il vous aide à l'envoyer à sqlite3 Obtenez la réponse que vous voulez 
cur.execute('DROP TABLE IF EXISTS Counts') # Si le fichier existe, Et j'ai abandonné l'original table,Préventionblow up, Cette étape est de s'assurer que nous avons un nouveau fichier start it fresh
cur.execute(''' CREATE TABLE Counts (email TEXT, count INTEGER)''') # Créer une table
fname = input('Enter file name: ')
if (len(fname) < 1): fname = 'mbox-short.txt'
fh = open(fname)
for line in fh:
if not line.startswith('From: '): continue # Élu par From: Ligne de début
pieces = line.split()
email = pieces[1] # ÉlectionemailSection
cur.execute('SELECT count FROM Counts WHERE email = ? ', (email,))
# Parmi eux?Est un substituant,En cours d'exécutionemailRemplira automatiquement?;(email,) Il n'y a qu'un seul élément turple; Cette ligne est pour voir les tableaux existants 
row = cur.fetchone() # Lire une ligne
if row is None: # Si ce n'est pas dans le tableau emailInsérer
cur.execute('''INSERT INTO Counts (email, count) VALUES (?, 1)''', (email,))
else: # Si c'est le casemail,Justecount+1
cur.execute('UPDATE Counts SET count = count + 1 WHERE email = ?',
(email,))
conn.commit() # Assurez - vous que chaque ligne est exécutée ,Écrire des donnéesmain memoryOudisk
# https://www.sqlite.org/lang_select.html
sqlstr = 'SELECT email, count FROM Counts ORDER BY count DESC LIMIT 10'
# Choisissez parmi les dix meilleurs messages par ordre décroissant 
for row in cur.execute(sqlstr): # InpythonExécution intermédiairesql Il faut ajouter cur.execute()
print(str(row[0]), row[1]) # Convertir enstrInpythonProduits intermédiaires 
cur.close() # Fermersqllite

Detwitter API Pour accéder à un compte Twitter most recent friendInformations stockées danssqlMoyenne

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('spider.sqlite') # CréationsqliteDocumentation
cur = conn.cursor()
cur.execute(''' CREATE TABLE IF NOT EXISTS Twitter (name TEXT, retrieved INTEGER, friends INTEGER)''')
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
while True:
acct = input('Enter a Twitter account, or quit: ')
if (acct == 'quit'): break
if (len(acct) < 1):
cur.execute('SELECT name FROM Twitter WHERE retrieved = 0 LIMIT 1')
try:
acct = cur.fetchone()[0] # Voirfirst column of first row
except:
print('No unretrieved Twitter accounts found')
continue
url = twurl.augment(TWITTER_URL, {
'screen_name': acct, 'count': '20'})
print('Retrieving', url)
connection = urlopen(url, context=ctx)
data = connection.read().decode()
headers = dict(connection.getheaders())
print('Remaining', headers['x-rate-limit-remaining'])
js = json.loads(data)
# Debugging
# print json.dumps(js, indent=4)
cur.execute('UPDATE Twitter SET retrieved=1 WHERE name = ?', (acct, ))
countnew = 0
countold = 0
for u in js['users']:
friend = u['screen_name']
print(friend)
cur.execute('SELECT friends FROM Twitter WHERE name = ? LIMIT 1',
(friend, ))
try:
count = cur.fetchone()[0]
cur.execute('UPDATE Twitter SET friends = ? WHERE name = ?',
(count+1, friend))
countold = countold + 1
except:
cur.execute('''INSERT INTO Twitter (name, retrieved, friends) VALUES (?, 0, 1)''', (friend, ))
countnew = countnew + 1
print('New accounts=', countnew, ' revisited=', countold)
conn.commit()
cur.close()

Data Model

Insérer la description de l'image ici
Insérer la description de l'image ici

Key

Insérer la description de l'image ici
Générer des clés primaires entières entre les tables n'est pas seulement pratique reference, Il n'affecte pas non plus les modifications apportées aux données brutes
“INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE”Lors de la création de la table, Déclarez la clé primaire avec cette instruction
Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici

SQL for Multi-Table-- Clé primaire、Clé étrangère、Connexion

Relationship Building(in tables)

Insérer la description de l'image ici

-- Créer une table, Et générer la clé primaire 
CREATE TABLE "Artist" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, /* Créer un nomidClé primaire pour, Le type de données est un entier,AUTOINCREMENT Indique le nombre d'incréments automatiques générés ,NOT NULLReprésentant non vide, UNIQUE Représente que le nombre généré ne coïncide pas */
"name" TEXT)
CREATE TABLE "Album" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE,
artist_id INTEGER, /* La Déclaration d'une clé étrangère n'exige pas de guillemets ,SQLiteMoyenne Aucune déclaration distincte n'est requise pour indiquer qu'il s'agit foreign key */
"title" TEXT)
CREATE TABLE "Genre" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE,
"name" TEXT)
CREATE TABLE "Track" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE,
album_id INTEGER, genre_id INTEGER, len INTEGER, rating INTEGER,
"title" TEXT, "count" INTEGER)
/* Trier les relations logiques entre les tables pour créer les tables nécessaires , Et générer pour chaque tableau id*/
-- Insérer des données
INSERT INTO Artist (name) VALUES ('Led Zepplin')
INSERT INTO Artist (name) VALUES ('AC/DC')
INSERT INTO Genre (name) VALUES ('Rock') ;
INSERT INTO Genre (name) VALUES ('Metal');
INSERT INTO Album (title, artist_id) VALUES ('Who Made Who', 2);
INSERT INTO Album (title, artist_id) VALUES ('IV', 1);
INSERT INTO Track (title, rating, len, count, album_id, genre_id)
VALUES ('Black Dog', 5, 297, 0, 2, 1) ;
INSERT INTO Track (title, rating, len, count, album_id, genre_id)
VALUES ('Stairway', 5, 482, 0, 2, 1) ;
INSERT INTO Track (title, rating, len, count, album_id, genre_id)
VALUES ('About to Rock', 5, 313, 0, 1, 2) ;
INSERT INTO Track (title, rating, len, count, album_id, genre_id)
VALUES ('Who Made Who', 5, 207, 0, 1, 2) ;

Les relations entre les tableaux sont les suivantes
Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici

-- Connexion
SELECT Album.title, Artist.name FROM Album JOIN Artist
ON Album.artist_id = Artist.id
/*Lors de la connexion des tables,Tous les formats sonttable.rowname;onC'est un filtre,Si ce n'est pas le cas,on clause Alors tout ce qui est possible rowCombinaison DeAlbumEtArtist Sélectionnez séparément titleEtname, Appuyez sur Album.artist_id = Artist.idMéthode correspondante, Sélectionnez deux colonnes */
SELECT Album.title, Album.artist_id, Artist.id, Artist.name
FROM Album JOIN Artist ON Album.artist_id = Artist.id
/*Je vois.Album.artist_idEtArtist.idC'est une correspondance individuelle*/
SELECT Track.title, Track.genre_id, Genre.id, Genre.name
FROM Track JOIN Genre
SELECT Track.title, Genre.name FROM Track JOIN Genre
ON Track.genre_id = Genre.id
SELECT Track.title, Artist.name, Album.title, Genre.name
FROM Track JOIN Genre JOIN Album JOIN Artist
ON Track.genre_id = Genre.id AND Track.album_id = Album.id
AND Album.artist_id = Artist.id
/*on clause Il y a plusieurs conditions côte à côte ,AvecandConnexion*/

UtilisationpythonLirexmlEt créer une base de données

import xml.etree.ElementTree as ET
import sqlite3
conn = sqlite3.connect('trackdb.sqlite')
cur = conn.cursor()
# Make some fresh tables using executescript()-- It allows multiple SQL statements separated by semicolons,Si ouinormal execute() method Je ne peux pas lancer plus d'une ligne sqlDéclarations
cur.executescript(''' DROP TABLE IF EXISTS Artist; DROP TABLE IF EXISTS Album; DROP TABLE IF EXISTS Track; CREATE TABLE Artist ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, name TEXT UNIQUE ); CREATE TABLE Album ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, artist_id INTEGER, title TEXT UNIQUE ); CREATE TABLE Track ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, title TEXT UNIQUE, album_id INTEGER, len INTEGER, rating INTEGER, count INTEGER ); ''')
fname = input('Enter file name: ')
if ( len(fname) < 1 ) : fname = 'Library.xml'
# <key>Track ID</key><integer>369</integer>
# <key>Name</key><string>Another One Bites The Dust</string>
# <key>Artist</key><string>Queen</string>
def lookup(d, key):
found = False
for child in d:
if found : return child.text # Convertir en chaîne
if child.tag == 'key' and child.text == key : #ChoisisseztagPourkey, Et contient l'étiquette cible 
found = True
return None
stuff = ET.parse(fname)
all = stuff.findall('dict/dict/dict')#Cherche tout<dict>Informations
print('Dict count:', len(all))
for entry in all:
if ( lookup(entry, 'Track ID') is None ) : continue
name = lookup(entry, 'Name')
artist = lookup(entry, 'Artist')
album = lookup(entry, 'Album')
count = lookup(entry, 'Play Count')
rating = lookup(entry, 'Rating')
length = lookup(entry, 'Total Time')
if name is None or artist is None or album is None :
continue
print(name, artist, album, count, rating, length)
cur.execute('''INSERT OR IGNORE INTO Artist (name) VALUES ( ? )''', ( artist, ) ) #INSERT OR IGNORE C'est - à - dire si elle existe déjà ignorePlus jamaisinsertC'est
cur.execute('SELECT id FROM Artist WHERE name = ? ', (artist, ))
artist_id = cur.fetchone()[0]
cur.execute('''INSERT OR IGNORE INTO Album (title, artist_id) VALUES ( ?, ? )''', ( album, artist_id ) )
cur.execute('SELECT id FROM Album WHERE title = ? ', (album, ))
album_id = cur.fetchone()[0]
cur.execute('''INSERT OR REPLACE INTO Track (title, album_id, len, rating, count) VALUES ( ?, ?, ?, ?, ? )''', # INSERT OR REPLACE Cela signifie que si les données existent déjà update
( name, album_id, length, rating, count ) )
conn.commit()

SQL for Many-Many Relationship-- Clé primaire、Clé étrangère、Connexion

Insérer la description de l'image ici

-- Créer plusieurs tableaux 
CREATE TABLE User (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT UNIQUE, /* La partie qui se croisera après la garantie unique, Facile à associer à la recherche */
email TEXT
) ;
CREATE TABLE Course (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
title TEXT UNIQUE
) ;
CREATE TABLE Member (
user_id INTEGER,
course_id INTEGER,
role INTEGER,
PRIMARY KEY (user_id, course_id)-- Comment les deux clés primaires sont créées 
) ;
-- Insérer des données
INSERT INTO User (name, email) VALUES ('Jane', '[email protected]');
INSERT INTO User (name, email) VALUES ('Ed', '[email protected]');
INSERT INTO User (name, email) VALUES ('Sue', '[email protected]');
INSERT INTO Course (title) VALUES ('Python');
INSERT INTO Course (title) VALUES ('SQL');
INSERT INTO Course (title) VALUES ('PHP');
INSERT INTO Member (user_id, course_id, role) VALUES (1, 1, 1);
INSERT INTO Member (user_id, course_id, role) VALUES (2, 1, 0);
INSERT INTO Member (user_id, course_id, role) VALUES (3, 1, 0);
INSERT INTO Member (user_id, course_id, role) VALUES (1, 2, 0);
INSERT INTO Member (user_id, course_id, role) VALUES (2, 2, 1);
INSERT INTO Member (user_id, course_id, role) VALUES (2, 3, 1);
INSERT INTO Member (user_id, course_id, role) VALUES (3, 3, 0);
-- Requête fédérée Multi - tables 
SELECT User.name, Member.role, Course.title
FROM User JOIN Member JOIN Course-- Avec deux JOIN
ON Member.user_id = User.id AND Member.course_id = Course.id
ORDER BY Course.title, Member.role DESC, User.name /*Course.title, Member.roleOrdre décroissant,User.name Pas besoin de changer de séquence */

UtilisationpythonLirejsonEt créer une base de données

import json
import sqlite3
conn = sqlite3.connect('rosterdb.sqlite')
cur = conn.cursor()
# Do some setup
cur.executescript(''' DROP TABLE IF EXISTS User; DROP TABLE IF EXISTS Member; DROP TABLE IF EXISTS Course; CREATE TABLE User ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, name TEXT UNIQUE ); CREATE TABLE Course ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, title TEXT UNIQUE ); CREATE TABLE Member ( user_id INTEGER, course_id INTEGER, role INTEGER, PRIMARY KEY (user_id, course_id) ) ''')
fname = input('Enter file name: ')
if len(fname) < 1:
fname = 'roster_data_sample.json'
# Ce qui suit s'appelle un entry
# [
# [ "Charley" #C'estentry[0], "si110" #C'estentry[1], 1 ], 
# [ "Mea", "si110", 0 ],
str_data = open(fname).read()
json_data = json.loads(str_data)
for entry in json_data:
name = entry[0]
title = entry[1]
print((name, title))
cur.execute('''INSERT OR IGNORE INTO User (name) VALUES ( ? )''', ( name, ) ) # IGNORE, Après la duplication de la clé primaire ou de l'index unique , L'insertion échouera ,Mais pas d'erreur., Cette insertion sera ignorée 
cur.execute('SELECT id FROM User WHERE name = ? ', (name, ))
user_id = cur.fetchone()[0] #if no rows match the WHERE clause,RenvoieNone
cur.execute('''INSERT OR IGNORE INTO Course (title) VALUES ( ? )''', ( title, ) )
cur.execute('SELECT id FROM Course WHERE title = ? ', (title, ))
course_id = cur.fetchone()[0]
cur.execute('''INSERT OR REPLACE INTO Member (user_id, course_id) VALUES ( ?, ? )''', # REPLACE, Après la duplication de la clé primaire ou de l'index unique , Les données originales seront supprimées , Et insérer ce nouvel enregistrement 
( user_id, course_id ) )
conn.commit()

Conclusion

La construction de la base de données est complexe , Mais des constructions complexes signifient que la logique relationnelle entre les données est clarifiée , Cela augmente considérablement la vitesse de traitement des données
Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici
GeodataVisualisation des données:

import urllib.request, urllib.parse, urllib.error
import http
import sqlite3
import json
import time
import ssl
import sys
api_key = False
if api_key is False:
api_key = 42
serviceurl = "http://py4e-data.dr-chuck.net/json?"
else :
serviceurl = "https://maps.googleapis.com/maps/api/geocode/json?"
# Additional detail for urllib
# http.client.HTTPConnection.debuglevel = 1
conn = sqlite3.connect('geodata.sqlite')
cur = conn.cursor()
cur.execute(''' CREATE TABLE IF NOT EXISTS Locations (address TEXT, geodata TEXT)''')
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
fh = open("where.data")
count = 0
for line in fh:
if count > 200 :
print('Retrieved 200 locations, restart to retrieve more')
break
address = line.strip()
print('')
cur.execute("SELECT geodata FROM Locations WHERE address= ?",
(memoryview(address.encode()), ))
try:
data = cur.fetchone()[0]
print("Found in database ",address)
continue
except:
pass # Non, non.blow up Poursuivre la procédure suivante 
parms = dict()
parms["address"] = address
if api_key is not False: parms['key'] = api_key
url = serviceurl + urllib.parse.urlencode(parms)
print('Retrieving', url)
uh = urllib.request.urlopen(url, context=ctx)
data = uh.read().decode()
print('Retrieved', len(data), 'characters', data[:20].replace('\n', ' '))
count = count + 1
try:
js = json.loads(data)
except:
print(data) # We print in case unicode causes an error
continue
if 'status' not in js or (js['status'] != 'OK' and js['status'] != 'ZERO_RESULTS') :
print('==== Failure To Retrieve ====')
print(data)
break
cur.execute('''INSERT INTO Locations (address, geodata) VALUES ( ?, ? )''', (memoryview(address.encode()), memoryview(data.encode()) ) )
conn.commit()
if count % 10 == 0 :
print('Pausing for a bit...')
time.sleep(5)
print("Run geodump.py to read the data from the database so you can vizualize it on a map.")
Copyright:Cet article est[Wnuow]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2022/204/202207231043293699.html