Τα πάντα για την Python

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 18 Ιούλ 2011, 14:28

Διαθέσιμη version του sqlobject για python3 δεν υπάρχει; Δεν μπόρεσα να βρω πουθενά...
Κάτι αντίστοιχο για python3;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό pmav99 » 18 Ιούλ 2011, 14:59

Δες αν θέλεις το SQLAlchemy και το Elixir

http://www.sqlalchemy.org/features.html
http://elixir.ematia.de/trac/wiki

Nομίζω και τα 2 υποστηρίζουν python3
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 19 Ιούλ 2011, 19:21

Ευχαριστώ pmav, τελικά ξεκίνησα με Sqlalchemy.
Και έχω κολλήσει σε ένα συγκεκριμένο βασικό σημείο.
Έστω ότι έχω δημιουργήσει μια database:

Spoiler: show
Κώδικας: Επιλογή όλων
#!/usr/bin/python3
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
engine = create_engine('sqlite:///paradigma.db')
metadata = MetaData()

users_table = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('fullname', String),
Column('password', String))

metadata.create_all(engine)

class User(object):
def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
def __repr__(self):
return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)

from sqlalchemy.orm import mapper
mapper(User, users_table)

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
ed_user = User('ed', 'Ed Jones', 'edspassword')
session.add(ed_user)
session.commit()


Δεν μπορώ να καταλάβω με τίποτα πως θα τη χρησιμοποιήσω από άλλο πρόγραμμα.
Δηλαδή να δημιουργήσω ένα πρόγραμμα το οποίο θα μου προβάλει τα στοιχεία του ed_user χρησιμοποιώντας την συγκεκριμένη database που έχει δημιουργηθεί ήδη.
Δεν βρίσκω τον τρόπο στα tutorial της sqlalchemy (http://www.sqlalchemy.org/docs/). Έψαξα και επιπλέον οδηγούς αλλά εξακολουθώ να μην βγάζω άκρη! :wtf:
Κάποιος που να γνωρίζει;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Qdata » 19 Ιούλ 2011, 19:29

Έστω ότι το αρχείο ονομάζετε arxeio.py το χρησιμοποιείς σαν άρθρωμα με την εντολή:
Κώδικας: Επιλογή όλων
import arxeio.py


(Αν κατάλαβα σωστά)
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 19 Ιούλ 2011, 19:34

Qdata έγραψε:Έστω ότι το αρχείο ονομάζετε arxeio.py το χρησιμοποιείς σαν άρθρωμα με την εντολή:
Κώδικας: Επιλογή όλων
import arxeio.py

(Αν κατάλαβα σωστά)


Νομίζω ότι ο σωστός τρόπος είναι να προσπελάσεις με κάποιον τρόπο την database.
Αν κάνω import δεν λύνεται το πρόβλημα.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Qdata » 19 Ιούλ 2011, 19:52

Ilias95 έγραψε:Νομίζω ότι ο σωστός τρόπος είναι να προσπελάσεις με κάποιον τρόπο την database.
Αν κάνω import δεν λύνεται το πρόβλημα.


Αν κατάλαβα καλά θέλεις να πάρεις μόνο μια πληροφορία από το πρόγραμμά σου;Αν ναι μπορείς να την αποθηκεύσεις σε ένα εξωτερικό αρχείο.
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 19 Ιούλ 2011, 20:00

Qdata έγραψε:
Ilias95 έγραψε:Νομίζω ότι ο σωστός τρόπος είναι να προσπελάσεις με κάποιον τρόπο την database.
Αν κάνω import δεν λύνεται το πρόβλημα.


Αν κατάλαβα καλά θέλεις να πάρεις μόνο μια πληροφορία από το πρόγραμμά σου;Αν ναι μπορείς να την αποθηκεύσεις σε ένα εξωτερικό αρχείο.


Όχι. Θέλω να προσπελάσω την υπάρχουσα database και να αντλήσω οποιαδήποτε πληροφορία είναι αποθηκευμένη σε αυτή, όποτε θέλω.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό pmav99 » 20 Ιούλ 2011, 12:02

Πρέπει να κάνεις ένα query. Να ζητήσεις δηλαδή από τη βάση δεδομένων σου τα στοιχεία σου. Θα το δεις να αναφέρεται και σαν select.

Κάνεις connect δηλαδή με τη βάση δεδομένων από το πρόγραμμα σου και δίνεις κάτι τέτοιο:
Κώδικας: Επιλογή όλων
for instance in session.query(User).order_by(User.name):
print instance.name, instance.fullname


Δες αυτά
http://www.sqlalchemy.org/docs/orm/tuto ... l#querying
http://mapfish.org/doc/tutorials/sqlalchemy.html
http://www.blog.pythonlibrary.org/2010/ ... rt-1-of-2/
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 20 Ιούλ 2011, 12:17

pmav99 έγραψε:Πρέπει να κάνεις ένα query. Να ζητήσεις δηλαδή από τη βάση δεδομένων σου τα στοιχεία σου. Θα το δεις να αναφέρεται και σαν select.

Κάνεις connect δηλαδή με τη βάση δεδομένων από το πρόγραμμα σου και δίνεις κάτι τέτοιο:
Κώδικας: Επιλογή όλων
for instance in session.query(User).order_by(User.name):
print instance.name, instance.fullname


Δες αυτά
http://www.sqlalchemy.org/docs/orm/tuto ... l#querying
http://mapfish.org/doc/tutorials/sqlalchemy.html
http://www.blog.pythonlibrary.org/2010/ ... rt-1-of-2/


Ευχαριστώ πολύ, όντως έτσι γίνεται.
Επίσης με δοκιμές είδα ότι για να έχεις πρόσβαση από άλλο πρόγραμμα πρέπει να δηλώσεις ξανά την engine, τις κλάσεις και την session.
Κάτι πάω να καταλάβω...
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 22 Ιούλ 2011, 18:20

Θα χρειαστώ τα φώτα σας για άλλη μια φόρα.
Ένα κομμάτι κώδικα, το οποίο πραγματικά με έχει βγάλει έξω απ' τα ρούχα μου: :twisted: (χρειάζεται sqlalchemy για να τρέξει)

Spoiler: show
Κώδικας: Επιλογή όλων
#!/usr/bin/python3

from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.orm import relationship, backref
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class Categories(Base):
__tablename__ = 'categories'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
def __init__(self, name):
self.name = name

class Epafes(Base):
__tablename__ = 'epafes'
id = Column(Integer, primary_key=True)
name = Column(String)
category = Column(Integer, ForeignKey('categories.id'))
category_relation = relationship(Categories)
def __init__(self, name=None, category=None):
self.name = name
self.category = category

metadata = Base.metadata
metadata.create_all(engine)

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()

kwstas = Epafes() # Προσθήκα επαφής χειροκίνητα.
kwstas.name = 'Kwstas'
kwstas.category = 'filoi'
categ = Categories(kwstas.category)
categ.epafes = [kwstas]
session.add(kwstas)
session.add(categ)
session.commit()

def prosthiki():
print('\nΕισάγεται τα στοιχεία της επαφής: \n')
epafi = Epafes()
epafi.name = input('Όνομα: ')
epafi.category = input('Κατηγορία: ')
cat = Categories(epafi.category)
cat.epafes = [epafi]
session.add(epafi)
session.add(cat)
session.commit()

while True:
apantisi = input()
if apantisi == '1':
prosthiki()
elif apantisi == '2':
for categ in session.query(Categories):
for epafi in categ.epafes:
print(epafi.name)


Μες τον κώδικα έχω δηλώσει χειροκίνητα μια επαφή με όνομα μεταβλητής kwstas και μία κατηγορία επίσης, ενώ τα έχω προσθέσει και τα δύο στην session.
Αν πατήσω '2' για να εμφανίσω τα ονόματα των επαφών σε κάθε κατηγορία όταν τρέχει το πρόγραμμα θα μου εμφανίσει το όνομα του Κώστα το οποίο και περιμένω. Καλά ως εδώ.
Αν στην συνέχεια πατήσω '1' και κάνω προσθήκη επαφής και ξαναπατήσω '2' θα πάρω AttributeError.
Θα εκτυπώσει κανονικά το όνομα του Κώστα αλλά στην δεύτερη κατηγορία θα μου πει ότι δεν υπάρχει Categories.epafes! :shock:
Γιατί γίνεται αυτό; Αφού κάνω ακριβώς την ίδια διαδικασία και τις δύο φορές. :wtf:

Επίσης, αν αλλάξουμε τον κώδικα της συνάρτησης prosthiki() σε:
Spoiler: show
Κώδικας: Επιλογή όλων
def prosthiki():
print('\nΕισάγεται τα στοιχεία της επαφής: \n')
epafi = Epafes()
epafi.name = input('Όνομα: ')
epafi.category = input('Κατηγορία: ')
cat = Categories(epafi.category)
cat.epafes = [epafi]
session.add(epafi)
session.add(cat)
session.commit()
for categ in session.query(Categories):
for epafi in categ.epafes:
print(epafi.name)


και πατήσω '1' για προσθήκη, την πρώτη φορά που θα το κάνω θα μου εμφανίσει κανονικά το όνομα της επαφής και θα βρει το Categories.epafes της επαφής η οποία μόλις δηλώθηκε!
Αλλά, αν δεν κλείσω το πρόγραμμα και ξαναπατήσω '1', αφού κάνω την προσθήκη θα μου βγει πάλι το AttributeError γιατί δεν θα βρίσκει το Categories.epafes της επαφής που καταχωρήθηκε νωρίτερα! :shock: :shock: :shock:

Πρώτη φορά νευριάζω τόσο με μερικές σειρές κώδικα. :lol:
Ευχαριστώ εκ των προτέρων.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι