[Python] Verbinden met SQLServer

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • wsuijker
  • Registratie: Maart 2023
  • Laatst online: 18-05-2024
Ik zet een verbinding op naar MSSQLSERVER via python. De verbinding opzetten lukt alsook om een tabel aan te maken. Echter als ik de tabel tracht te vullen via een insert opdracht dan gaat dit foutief.


Welke software gebruik ik:
Microsoft SQL Server 2016
Python 3.9
PYCharm
Windows

Er wordt geen foutmelding getoond echter de records worden niet weggeschreven.


Ik heb heden de volgende code:

Python:
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
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData
import urllib
import pyodbc
import pandas as pd

conn = urllib.parse.quote_plus(
    'Data Source Name=5CG8214;'
    'Driver={ODBC Driver 17 for SQL Server};'
    'Server=5CG8214;'
    'Database=Wim;'
    'Trusted_connection=yes;'
)

try:
    coxn = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(conn))
    print("Passed")
except:
    print("failed")

sql = '''\
select * from [Wim].[dbo].[Information]
'''

meta = MetaData()

students = Table(
    'students', meta,
    Column('id', Integer, primary_key=True),
    Column('name', String),
    Column('lastname', String),
)
meta.create_all(coxn)

ins = students.insert().values([
    {'name': 'Bob', 'lastname': 'Marley'},
    {'name': 'Bob', 'lastname': 'Dylan'}
])

conn = coxn.connect()
end = conn.execute(ins)
conn.close()

# df1 = pd.read_sql_query(sql, coxn)

[ Voor 3% gewijzigd door wsuijker op 10-03-2023 14:26 . Reden: aanpassing qua foutmelding ]

Beste antwoord (via wsuijker op 13-03-2023 08:27)


  • MSteverink
  • Registratie: Juni 2004
  • Laatst online: 07-09 10:19
Ontbreekt er een COMMIT?

Alle reacties


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ook in dit topic beantwoord je de vraag "wat heb je zelf al geprobeerd, gezocht en gevonden" (om je probleem op te lossen uiteraard) niet. We verwachten hier, zoals je in de Quickstart kunt lezen, waar ik je in je vorige topic ook al naar verwees, wel wat meer van een topicstart dan "dit is mijn code, het werkt niet" :)

Ook met "dan gaat dit foutief" kunnen we natuurlijk niets; wat is "foutief"? Krijg je een foutmelding? Wordt de data ge-insert maar klopt er iets niet als je in de tabel gaat kijken? Als je een foutmelding krijgt vermeld dan op z'n minst dat; zoals (wederom) in de Quickstart ook duidelijk aangegeven is.

En wanneer je code post, gebruik dan code tags a.u.b ;)

Ik laat je topic (voor nu) open, maar ik zou dus wel graag zien dat je je topicstart aanpast met gevraagde infomatie. Je kunt je topicstart aanpassen door op "Wijzig" (rechtsbovenaan je post) te klikken.

Inhoudelijk: Ik ben geen Python expert, maar ik vind 't gebruik van conn en coxn erg verwarrend. Helemaal omdat conn de ene keer een connectionstring lijkt te zijn (regel 7) en verderop een connectie (regel 40). Ik zou daar op z'n minst duidelijke(re) variabelenamen voor gebruiken.

Verder: wilde gok; maar moet je ID niet (ook) auto-increment (identity in SQL Server / PostgreSQL termen) o.i.d. zijn? Je maakt 't ID nu alleen primary key, maar daarmee weet SQL Server nog steeds niet wat 'ie dan moet doen als je géén ID (regel 35) specificeert.

Maar goed, zoals gezegd: Het blijft gokken als je alleen maar "dan gaat dit foutief" aangeeft. Een foutmelding zou handig zijn ;)

Oh, en tot slot: Ik heb je topictitel aangepast; zoals ik (ook al) in je vorige topic aangaf, we spreken hier gewoon Nederlands ;) Maar "connect to SQLServer with python (use of pandas included)" a) lijkt te impliceren dat 't verbinden mis gaat terwijl je in je topic aangeeft "de verbinding opzetten lukt " en b) het (wel-of-niet) gebruik van pandas lijkt me verder voor je vraag irrelevant :?

[ Voor 58% gewijzigd door RobIII op 10-03-2023 14:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • MSteverink
  • Registratie: Juni 2004
  • Laatst online: 07-09 10:19
Ontbreekt er een COMMIT?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Er wordt zover ik zie geen (expliciete) transactie gestart, dus een commit zou niet nodig moeten zijn - als er al een transactie is, dan is 't een impliciete en dan is de commit dat ook :P (Of die sqlalchemy is een rare library, dat kan ook :+ ). Het zou fijn zijn als @wsuijker even reageert op alles en de topicstart aanvult als verzocht :)

[ Voor 19% gewijzigd door RobIII op 10-03-2023 18:07 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • wsuijker
  • Registratie: Maart 2023
  • Laatst online: 18-05-2024
Het werkt.. De toevoeging van Commit zorgt voor de werking Dank u

Hierbij de code:

Python:
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
import sqlalchemy as sa
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData
import urllib
import pyodbc
import pandas as pd

conn = urllib.parse.quote_plus(
    'Data Source Name=5CG8214;'
    'Driver={ODBC Driver 17 for SQL Server};'
    'Server=5CG8214;'
    'Database=Wim;'
    'Trusted_connection=yes;'
)

try:
    coxn = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(conn))
    print("Passed")
except:
    print("failed")

meta = MetaData()

students = Table(
    'students', meta,
    Column('id', Integer, primary_key=True),
    Column('name', String),
    Column('lastname', String),
)
meta.create_all(coxn)

ins = students.insert().values([
    {'name': 'Bob', 'lastname': 'Marley'},
    {'name': 'Bob', 'lastname': 'Dylan'}
])

conn = coxn.connect()
end = conn.execute(ins).cursor
conn.commit()
conn.close()

[ Voor 0% gewijzigd door RobIII op 11-03-2023 12:42 . Reden: (Weer) code tags toegevoegd ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
wsuijker schreef op zaterdag 11 maart 2023 @ 09:05:
Het werkt.. De toevoeging van Commit zorgt voor de werking Dank u
Klik dan nog even op "Beste antwoord" bij MSteverink in "[Python] Verbinden met SQLServer" ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • +1 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 23:21

Reinier

\o/

Je hebt er nu ook .cursor achter gezet :? Dus waar lag het nou aan?

Acties:
  • +1 Henk 'm!

  • wsuijker
  • Registratie: Maart 2023
  • Laatst online: 18-05-2024
het lag aan de commit.

Als ik .cursor weg doe dan werkt het nog steeds. was even niet van bewust dat ik .cursor achter gezet had. sorry daarvoor
Pagina: 1