Postgresql python psycopg2

a marqué ce sujet comme résolu.

bonjour je voudrai créer un script fait pour s'inscrire dans une base de données dans le cadre d'un petit projet personnel: tout d'abord voici le code:

 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
import psycopg2
import hashlib
import sys

if len(sys.argv) < 3:
    sys.stdout.write('[usage] python inscriptor.py <username> <password>\n')
    sys.exit()

username = sys.argv[1]
password = hashlib.md5(sys.argv[2].encode()).hexdigest()

def new_account(username, password):
    try:
        conn = psycopg2.connect(dbname='adrenalin', user='postgres', password='bobo', host='127.0.0.1', port=5432)
        sys.stdout.write('Connected... creating your account')
    except psycopg2.Error:
        sys.stdout.write('connection failed...\n')
        sys.exit()

    cursor = conn.cursor()
    cursor.execute('INSERT INTO users (username, password) VALUES (?, ?)', (username, password))
    cursor.commit()

    sys.stdout.write('Welcome to AdrenalinZ chatroom service created by backtrack05\n')

new_account(username, password)

et l'issue:

1
2
3
    cursor.execute('INSERT INTO users (username, password) VALUES (?, ?)', (username, password))
psycopg2.ProgrammingError: syntax error at or near ","
LINE 1: INSERT INTO users (username, password) VALUES (?, ?)

j'ai lu quelques posts à propos de sa sur stackoverflow mais en vain pourriez-vous m'aider s'il vous plait ? merci d'avoir lu et bonne soirée

merci beaucoup tout e'abord. Mais en essayant de me connecter à ma base de données en utilisant un autre ordinateur(mac OS X Siera) et en utilisant ce script pour d'abord tester la connection:

1
2
3
4
import psycopg2
import sys

conn = psycopg2.connect(dbname='mydatabase', user='postgres', password='bobobo', host='192.168.1.34', port=5432, sslmode='require')

j'obtient cette outpout peu compréhensible après avoir lu des dizaines de posts sur stackoverflow:

1
psycopg2.OperationalError: server does not support SSL but SSL was required

j'eu la même outpout avec pgAdmin4 en essayant de créer un serveur avec le parmaètre: SSL=REQUIRE

j'ai éssayé de modifier pg_hba.conf et postgresql.conf en mettant ssl=on mais je ne sais pas restart le serveur, je n'ai pas postgres.app j'ai juste pgAdmin4. Quelqu'un à t'-il déjà eu ce problème ?? merci

Je ne connais pas PostGres, mais oui c'est ce que te dit l'erreur. Sans trop me documenter je pense qu'il faut que tu mettes SSL à off.

Cela dit, on peut aussi se demander quel est l'intérêt de sortir une artillerie lourde comme PostGreSQL pour un chat, au lieu de MySQL, ou même SQLite…

+0 -0

t'as peut-être raison enfaite c'est pour que les clients s'enregistrent de leurs ordi sur ma base de données située sur mon ordi mais usr mac os x on m'a proposé postgresql et pas autre chose, ya plus simple ? A partir d'un script python pour se connecter et insérer des données.

En fait pour moi les clients devraient passer par ton serveur pour s'enregistrer. Et seulement donner accès à ton serveur à cette BDD.

C'est beaucoup moins bancal comme fonctionnement. En particulier ça evite de donner un accès direct en lecture/écriture sur ta BDD à la terre entière. Ça permet aussi de pouvoir changer de techno de stockage sans toucher au client.

Et partant de là tu as l'embarras du choix pour choisir ta techno de BDD. Si tu veux rester sur du SQL, Sqlite est inclus dans la bibliothèque standard.

+0 -0

avec ce serveur c'est possible ?

 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
import socket
import sys
import threading
import select

_HOST = '192.168.1.22'
_PORT = 4567
_BUFFER = 1024
_RUNNING = True
_USERS = []

class Server(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.host = socket.gethostbyname(_HOST)
        self.port = int(_PORT)
        self.buffer = _BUFFER
        self.run = _RUNNING
        self.users = _USERS
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def broadcast_data(self, sock, data):
        for sockt in self.users:
            if sockt != self.sock and sockt != sock:
                try:
                    sockt.send(data.encode())
                except:
                    sockt.close()
                    self.users.remove(sockt)

    def main(self):
        try:
            self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.sock.bind((self.host, self.port))
            self.sock.listen(10)
            self.users.append(self.sock)
        except socket.error:
            print('Unable to connect ot the remote host: {0}'.format(self.host))
            sys.exit()
        print('Chat server started on port: ' + str(self.port) + '\r')

        while 1:

            read_sockets, write_sockets, in_error = select.select(self.users, [], [])

            for sockp in read_sockets:
                if sockp == self.sock:

                    sockfd, addr = self.sock.accept()
                    self.users.append(sockfd)
                    print('Client ({0}) connected\r'.format(addr))
                    self.broadcast_data(sockfd, '[{0}] entered the chatroom\r'.format(addr))

                else:

                    try:

                        data = sockp.recv(self.buffer).decode()
                        if data:
                            print('\r' + str(sockp.getpeername()) + data)
                            self.broadcast_data(sockp, '\r' + '(' + str(sockp.getpeername()) + ')' + ' ' +  data)

                        else:
                            if sockp in self.users:
                                self.users.remove(sockp)
                            self.broadcast_data(sockp, 'Client({0}) is offline\r'.format(addr))

                    except:

                        self.broadcast_data(sockp, 'Client({0}) is offline\r'.format(addr))
                        print('Client({0}) is offline\r'.format(addr))
                        continue
        self.sock.close()


if __name__ == '__main__':
    server = Server()
    server.main()

c'est une communication via terminal mais… tu m'as dit: la première fois que le client utilise le client.py et se connecte au serveur il doit entrer un nom d'utilisateur et un mdp ? mai comment peut savoir tout sa le serveur ? que c'est la première fois qu'un client se connecte ? je peux créer des commandes pour sa, genre /a = inscription ect mais sa serai galère ?

j'ai trouvé la solution mais j'aiemrais avoir comment puis-je faire pour que le serveur regarde dans la base de données, si il ne trouve pas le compte et bien il expulse le client du serveur en lui envoyant une erreur, comment fermer le socket d'un client a partir du serveur socket python ? merci

En fait je n'ai pas eu autant de temps que je voulais.

Pour résumer l'idée: actuellement sur ton serveur quand un client se connecte il ne peut faire qu'une chose, envoyer un seul type de message. L'idée ce serait que tu implémentes plusieurs commandes. Par exemple avec un préfixe, un peu comme IRC. Si le client envoie un "/create (user) (pass)" ça crée le client, s'il envoie un "/identify (user) (pass)" ça essaye de l'identifier, et s'il envoie "/message [le message]" ça envoie en message à tous les gens connectés et identifiés.

À mon avis c'est en partant sur ce genre de logique que tu arriveras au résultat voulu en minimisant le nombre d'efforts.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte