Mer hjälp med SQL

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Mer hjälp med SQL

Inlägg av RoPa »

Hej,

Har kommit en bit på väg men har problem med denna del, när en post läggs till av en annan process så kommer den inte upp här.
Tanken är att ha en process som skriver data till en tabell (fungerar) och ha fler oberoende processer (som denna) som läser ut senaste värdet när det har ändrat sig.
Denna läser bara ut senaste data en gång när den startar, försökte med cursor.execute("RESET QUERY CACHE") men det gjorde bara att try: satsen failade och jag hamnade i except:
Är detta rätt väg eller finns det en bättre väg att läsa ut bara nya poster?

Kod: Markera allt

try:
   while True:
      # read data from database        
      try:
         cursor.execute("SELECT * FROM indicators ORDER BY ind_id DESC LIMIT 1")
         row = cursor.fetchone()
         if (row["ind_stored"] != old):
            print "New data: ", row["ind_status"], row["ind_stored"], row["ind_id"]
            old = row["ind_stored"]
         
         #cursor.execute("RESET QUERY CACHE")
            
      except:
         print "Could not read data"
         break

finally:
   # disconnect from server
   db.close()
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Mer hjälp med SQL

Inlägg av sodjan »

> Har kommit en bit på väg...

Med vadå?
Är det någon gammal tråd som vi förväntas känna till?
Om man startar en ny tråd så får man nog beskriva det som är rellevant.
Eller så fortsätter man helt enkelt i den gamla tråden (om det finns en)... :-)

Men det har sannolikt med transaktionshanteringen att göra. Jag vet inte vad
du kör, men de flesta databaser har "repeatable read" som default. D.v.s att en
transaktion är garanterad att "se" datat så som det såg ut när transaktionen
startade. Det hjälper då inte att läsa om, om man inte gör COMMIT imellan.

Sen så vet jag inte om det är så smart att ligga i en "tight" loop och hamra på
med SELECT'er. Vad har du för krav på svarstid?

> Är detta rätt väg eller finns det en bättre väg att läsa ut bara nya poster?

Det normala är att den som skriver sätter ett status i varje post till något
och den som läser, läser och ändrar sedan status till "läst". Det blir ju lite
svårare när du har flera läsare, jag antar att alla ska se de nya posterna.

I stort så känns det hela feldesignat.
qx5
Inlägg: 1678
Blev medlem: 14 augusti 2014, 04:23:04

Re: Mer hjälp med SQL

Inlägg av qx5 »

Finns det någon bra bok du skulle rekommendera som introduktion, men som ändå inte är en 1000-sidig tegelsten?
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Mer hjälp med SQL

Inlägg av sodjan »

Frågar du mig? :-)
Och intro till vadå?

När det gäller specifikt "isolation levels" så finns ju alltid Wikipedia:
http://en.wikipedia.org/wiki/Isolation_ ... systems%29.
qx5
Inlägg: 1678
Blev medlem: 14 augusti 2014, 04:23:04

Re: Mer hjälp med SQL

Inlägg av qx5 »

Databaskonstruktion (tabeller, relationer, etc) och SQL ?
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Mer hjälp med SQL

Inlägg av sodjan »

OK, det var ju lite "bredare" målsättning... :-)
Grunderna är ju lika för alla rellationsdatabaser oavsett vilken det är.
Skillnaderna kommer i den fysiska implementeringen som kan skilja.
Men det här är väl kanske inget för just den *här* tråden.
Varje databas brukar också ha sin egen dokumentation...
danielr112
Inlägg: 8092
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Re: Mer hjälp med SQL

Inlägg av danielr112 »

Att läsa ut om nya poster som du beskrev där funkar helt ok och det används på flera ställen.
Man kan även använda:
SELECT max(ind_id) from indicators

eller varför inte
select ind_id from indicators where ind_id > $old_id

Osäker på vilken som är snabbast i praktiken. Beror ju lite på hur just din tabell är uppsatt.

Sedan som sas så ska man inte hamra en sådan här sak. Visst med lite tid emellan är det fine men inte om du har ms emellan. Isåfall bör du bygga in ett system så att processerna snackar med varandra istället.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Mer hjälp med SQL

Inlägg av johano »

Om det bara handlar om att "skicka" ett värde från en process till en eller fler andra processer så kanske någon annan form av "kommunikation" är lämpligare och snyggare än att ligga och polla mot en databastabell.

Jag har på sistone blivit väldigt förtjust i RabbitMQ som låter dig göra exakt sådana saker: http://www.rabbitmq.com/tutorials/tutor ... ython.html

/johan
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: Mer hjälp med SQL

Inlägg av Lennart Aspenryd »

Jag har nog fortfarande några böcker om SQL.
Skicka Pm med adress så skall jag kolla i garaget.
SQL är ju ett generellt språk, så det specifika kan man trimma vid installation.
Användarvisningsbild
Jan Almqvist
Inlägg: 1652
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Mer hjälp med SQL

Inlägg av Jan Almqvist »

Är man ute efter IPC så rekommenderar jag sockets.
Nerre
Inlägg: 27188
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Mer hjälp med SQL

Inlägg av Nerre »

Just det där problemet handlar väl om huruvida man jobbar direkt mot databasen eller en "kopia" i form av en snapshot eller liknande.

Ska man hela tiden jobba live mot en databas så måste ju alla poster man läser låsas för redigering (för annars kan ju nån annan session ändra samtidigt som man läser). Därför jobbar man normalt mot snapshots eller tillfälliga kopior i klienten.
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Re: Mer hjälp med SQL

Inlägg av RoPa »

@johano, rabbitmq har mina professionella kontakter föreslagit men för ett hobby projekt känns det lite för mycket.
process - process vore snyggast då jag helst vill ha det event drivet men med en till många så har jag inte hittat ett enkelt sätt att få till det. De som är mottagare kommer även att vara php script på en web så de kommer att komma och gå var 10'e sekund i ett long polling upplägg.


@danielr112, just nu är det bara en testloop och den kommer få en sleep i sig senare så den inte "hamrar" så mycket.
Ska prova dina selectsatser då de känns bättre än select *, sort och sedan limit.
MEN, det ger inte svar på varför min select sats ger samma svar gång på gång trots att det har skrivits in ny data i tabellen? Eller missförstod jag svaret?
Tabellen har ind_id (INT auto increment), ind_status (INT) och ind_Stored (char(20)) så den är väldigt enkel.

@Nerre, det är en mySQL för Raspbian och jag använder mySQLdb för Python. Snapshots låter som det skulle förklara beteendet men det är inget jag "bett om"...

@Jan Almqvist, helst skulle man gå till websockets då resultatet ska visas i en webläsare men återigen är det mer jobb än hobby projektet motiverar.

Orsaken till databas är att jag vill ha kvar alla händelser och sedan kunna filtrera ut listor på olika typer av händelser.
Och då tänkte jag att man kunde använda den för att förmedla ut data mellan processer.

Tack för era tips och svar!
Nerre
Inlägg: 27188
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Mer hjälp med SQL

Inlägg av Nerre »

Att du inte har "bett" om snapshots handlar nog mer om att du inte förstått att du gör det.

Jag är som sagt var inte helt insatt men du behöver förstå att du jobbar mot en klient som jobbar mot en server. Klienten försöker antagligen minimera anropen mot servern vilket innebär att så länge du gör samma select så kommer du få en cachad version. Du behöver tala om för klienten att den måste göra ett nytt anrop till servern och uppdatera select-resultatet. Exakt hur man gör detta vet jag inte om det är definierat i SQL som sådant eller om det beror på vilken klient och server man kör.

Jag har mest jobbat med databas i MS Office (Visual Basic) och där vill jag minnas att man skapade ett "recordset" med en select och sen jobbade man mot detta "recordset". För att läsa om det från själva databasen var man tvungen att göra en refresh eller nåt liknande.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Mer hjälp med SQL

Inlägg av johano »

Kan du visa koden som gör insert:en?

/johan
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Mer hjälp med SQL

Inlägg av sodjan »

> det är en mySQL för Raspbian

Kör den InnoDB?

> Klienten försöker antagligen minimera anropen mot servern vilket innebär
> att så länge du gör samma select så kommer du få en cachad version.

Det vore ju fullständigt diotiskt! Hur ska klienten veta om något har ändrats
eller inte? Nej, det handlar om *transaktioner* och "isolations nivåer". Det
går inte bara att titta på SELECT'en och tro att svaret alltid är samma.

Det är mycket bättre att se till att ha med "start transaction" och "commit" i loopen
så att man vet vad man håller på med. Gör man inte det så får men den
transaktions modell som råkar vara default. Och så vitt jag vet så kör MySQL
(med InnoDB) med "repeatable read" som default, d.v.s. att man garanteras
att se samma data inom samma transaktion.

Sen så kan man även ha "auto commit" påslaget (vet inte om det är default)
och då blir det hela lite annorlunda...

Samma sak gäller så klart för processen som gör insert, se till att ha en
korrekt transaktionshantering med "start transaction", "insert" och "commit"
så att man även där vet vad man håller på med.

Har en liknande funktion (dock helt annan miljö och databas) där 15-20
processer skriver i en tabell och en process pollar med 1 sec intervall för
att skicka ändringar till skärmar som visar produktionsläge på olika
monteringsbanor. Fungerar helt OK. Det rellevanta data ligger
cachat så det är liten belastning totalt sätt...
Skriv svar