Reply to comment

danigm's picture

El otro día un amigo me preguntó como hacer consultas a una base de datos mysql desde python y le comenté que con sqlalchemy se podía hacer. Yo ya había hecho algunas cosas con sqlalchemy, pero no había tratado con bases de datos ya creadas, sino que siempre las creaba con sqlalchemy.

He estado mirando un poco en la web de sqlalchemy y me he encontrado SqlSoup (SqlAlchemy).

SqlSoup mapea una base de datos ya creada a objetos python, así que no es necesario crear las clases o declarar las tablas en código python, se infieren directamente de la base de datos ya creada.

Veamos como funciona con un simple ejemplo con sqlite.

  1. Creamos la base de datos sqlite para las pruebas

    1. $ sqlite3 testdb.sqlite
    2. sqlite> create table users (name varchar(50), email varchar(100), primary key (name));
    3. sqlite> create table posts (id integer not_null auto_increment, user_id varchar(50),
    4. ...> text varchar, primary key (id), foreign key (user_id) references users(name));

  2. Aquí un script de prueba para ejecutar

    1. # <a href="http://www.sqlalchemy.org/docs/05/reference/ext/sqlsoup.html<br />
    2. #" title="http://www.sqlalchemy.org/docs/05/reference/ext/sqlsoup.html<br />
    3. #">http://www.sqlalchemy.org/docs/05/reference/ext/sqlsoup.html<br />
    4. #</a> Mapeando una base de datos ya creada para usar desde python de
    5. # manera simple y rapida.
    6.  
    7. # creamos la base de datos con sqlite3
    8. # sqlite3 testdb.sqlite
    9. # sqlite> create table users (name varchar(50), email varchar(100), primary key (name));
    10. # sqlite> create table posts (id integer not_null auto_increment, user_id varchar(50),
    11. # ...> text varchar, primary key (id), foreign key (user_id) references users(name));
    12.  
    13. from sqlalchemy.ext.sqlsoup import SqlSoup, Session
    14. from sqlalchemy import or_, and_, desc
    15.  
    16. #db = SqlSoup('mysql://scott:tiger@localhost/mydatabase')
    17. db = SqlSoup('sqlite:///testdb.sqlite')
    18.  
    19. def add_users():
    20. user = db.users.insert(name='danigm', email='dani@exp.com')
    21. user2 = db.users.insert(name='dani', email='danigm@exp.com')
    22. user3 = db.users.insert(name='pepe', email='pepe@exp.com')
    23. user4 = db.users.insert(name='juan', email='juan@exp.com')
    24.  
    25. db.flush()
    26. Session.commit()
    27.  
    28. def add_posts():
    29. post1 = db.posts.insert(id=1, user_id='danigm', text='comentario1')
    30. post2 = db.posts.insert(id=2, user_id='danigm', text='comentario2')
    31. post3 = db.posts.insert(id=3, user_id='pepe', text='comentario3')
    32. post4 = db.posts.insert(id=4, user_id='juan', text='comentario4')
    33. db.flush()
    34. Session.commit()
    35.  
    36. try:
    37. add_users()
    38. except:
    39. Session.rollback()
    40. try:
    41. add_posts()
    42. except:
    43. Session.rollback()
    44.  
    45. print db.users.filter(db.users.name=='danigm').first().name
    46.  
    47. where = or_(db.users.name=='danigm',
    48. db.users.email=='danigm@exp.com')
    49.  
    50. users = db.users.filter(where).order_by(desc(db.users.name)).all()
    51. print users
    52.  
    53. user = users[0]
    54. for post in db.posts.filter(db.posts.user_id == user.name):
    55. print user.name, post.text

  3. Veamoslo paso a paso

    1. db = SqlSoup('sqlite:///testdb.sqlite')

    Con esta simple línea tenemos el objeto db que está conectado con la base de datos y ya podemos empezar a hacer consultas u otras cosas.

    1. user = db.users.insert(name='danigm', email='dani@danigm.net')
    2. db.flush()
    3. Session.commit()

    Podemos acceder a las tablas por su nombre directamente, db.users, db.posts y estos objetos tienen métodos para insertar, borrar o filtrar de tal forma que podamos hacer la consulta deseada, en este ejemplo añadimos un usuario. Hay que tener en cuenta que para que los cambios se vean reflejados hay que ejecutar el commit().

    1. print db.users.filter(db.users.name=='danigm').first().name

    se puede filtrar como en cualquier objeto de sqlite, en este ejemplo filtramos por nombre de usuario, nos quedamos con el primero y mostramos el nombre del mismo.

    1. where = or_(db.users.name=='danigm',
    2. db.users.email=='danigm@exp.com')
    3.  
    4. users = db.users.filter(where).order_by(desc(db.users.name)).all()
    5. print users
    6.  
    7. user = users[0]
    8. for post in db.posts.filter(db.posts.user_id == user.name):
    9. print user.name, post.text

    Y una vez dominado el uso de sqlalchemy se pueden hacer filtros más complejos con otras directivas. combinando filtros y usando toda la potencia que te da sqlalchemy.

Con este ejemplo vemos que acceder a bases de datos desde python es muy fácil con sqlalchemy y además puedes hacerlo independiente del motor de base de datos gracias a que sqlalchemy soporta mysql, postgresql, sqlite, oracle, firebird, MS-SQL, MSAccess.

Reply

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.
  • You can enable syntax highlighting of source code with the following tags: <python>, <php>, <java>, <c>. The supported tag styles are: <foo>, [foo].

More information about formatting options

CAPTCHA
Esta pregunta es para distinguirte de un bot.
Image CAPTCHA
Enter the characters shown in the image.