Repository navigation
Expand file tree
/
Copy pathlibreria_skel.py
More file actions
135 lines (113 loc) · 3.45 KB
/
Copy pathlibreria_skel.py
File metadata and controls
135 lines (113 loc) · 3.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# --*-- encoding=utf-8 --*--
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import mapper, relationship,create_session,sessionmaker
from sqlalchemy import exc
from sqlalchemy import create_engine
from sqlalchemy import *
Base = declarative_base() #Todas las clases deben heredar de este objeto
class Autor(Base):
__tablename__='autor'
id_autor = Column(Integer, primary_key=True, autoincrement=True)
nombre = Column (String(100), unique=True)
libros = relationship("Libros", backref="autor")
def __init__(self, nombre=None):
self.nombre=nombre
class Libros(Base):
__tablename__='libros'
id_libro = Column(Integer, primary_key=True, autoincrement=True)
titulo = Column(String(100), unique=True)
editorial = Column(String(80))
fecha = Column(Integer)
precio = Column(Float)
portada = Column (String(100))
id_autor = Column(Integer, ForeignKey('autor.id_autor'))
def __init__(self, titulo=None, editorial=None, fecha=None, precio=None, portada=None):
self.titulo=titulo
self.editorial=editorial
self.fecha=fecha
self.precio=precio
self.portada=portada
def populate_database(L, session):
L_libros=[]
for d in L:
L_libros.append(Libros(titulo=d['titulo'],editorial=d['editorial'],fecha=d['fecha'],precio=d['precio']))
session.add_all(L_libros)
#session.commit()
grabar_savepoints(session)
author1 = Autor(nombre='Michael')
author2 = Autor(nombre='John Doe')
L_autores = [author1, author2]
session.add_all(L_autores)
grabar_savepoints(session)
# lee autores de fichero y los carga en BBDD
def lee_fich():
keys = ['titulo','id_autor','editorial','fecha','precio','portada']
f=file('libros.txt')
L_libros=[]
for line in f:
L=line.split(',')
L=[x.strip('\'') for x in L]
d=dict(zip(keys, L ))
L_libros.append(d)
print L_libros
return L_libros
# grabar con varios commits
def grabar_nosavepoints(session,records):
#añadimos, mirando antes si está duplicado el elemento
for a in records:
print a
try:
session.add(a)
session.commit()
except :
session.rollback()
print 'Entrada duplicada'
def grabar_savepoints(session):
# con save points: puntos de recuperacion
for record in session:
try:
with session.begin_nested():
session.merge(record)
except exc.IntegrityError,e:
print "Skipped record %s" % record
print e[0]
session.rollback()
session.commit()
def borrar_autor(sesion,nombre=None):
autor=session.query(Autor).filter_by(nombre=nombre).first()
if not autor:
session.close()
return -1
else:
session.delete(autor)
session.commit()
session.close()
return 0
def db_connect():
# mysql://joseanto:josino652@localhost/empresa
user='root'
pwd='afi2012'
host='localhost'
database='Libreria'
cad='mysql://'+user+':'+pwd+'@'+host+'/'+database
engine=create_engine(cad, encoding='utf-8')
return engine
def consulta_sql_raw(engine):
records=engine.execute("SELECT * FROM libros WHERE titulo LIKE'%%5%%'")
for row in records:
print 'Libros encontrados: ', row.titulo
if __name__=='__main__':
L=lee_fich()
engine=db_connect()
#imprimimos datos de conexión
print engine.name
print engine.url
#para generar los metadatos y poblar la BBDD
Base.metadata.create_all(engine)
#creamos una sesion
Session = sessionmaker(bind=engine)
session=Session()
grabar_savepoints(session)
populate_database(L,session)
consulta_sql_raw(engine)
borrar_autor(session, 'Michael')